Changeset 1237

Show
Ignore:
Timestamp:
12/16/09 18:53:22 (8 months ago)
Author:
astrange
Message:

Merge trunk's last-minute fixes to release branch.

Location:
branches/perian-1.2
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • branches/perian-1.2

  • branches/perian-1.2/CommonUtils.c

    r1203 r1237  
    572572        static CGColorSpaceRef sRGBColorSpace; 
    573573        int unlock = PerianInitEnter(&loaded); 
    574         CFStringRef *srgb; 
    575574 
    576575        if (!loaded) { 
    577576                loaded = TRUE; 
    578577 
    579                 if ((srgb = dlsym(RTLD_NEXT, "kCGColorSpaceSRGB"))) { 
    580                         sRGBColorSpace = CGColorSpaceCreateWithName(*srgb); // does not exist on 10.4 
     578                if (kCGColorSpaceSRGB) { 
     579                        sRGBColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); // does not exist on 10.4 
    581580                } else { 
    582581                        sRGBColorSpace = CreateColorSpaceFromSystemICCProfileName(CFSTR("sRGB Profile.icc")); 
  • branches/perian-1.2/FFissionCodec/FFissionDecoder.cpp

    r1152 r1237  
    129129        int initialMap[6] = {0, 1, 2, 3, 4, 5}; 
    130130        memcpy(fullChannelMap, initialMap, sizeof(initialMap)); 
     131         
     132        avcodec_get_context_defaults2(avContext, CODEC_TYPE_AUDIO); 
    131133} 
    132134 
     
    141143void FFissionDecoder::Initialize(const AudioStreamBasicDescription* inInputFormat, const AudioStreamBasicDescription* inOutputFormat, const void* inMagicCookie, UInt32 inMagicCookieByteSize) 
    142144{ 
    143         if (inMagicCookieByteSize > 0) 
     145        if (inMagicCookie) 
    144146                SetMagicCookie(inMagicCookie, inMagicCookieByteSize); 
    145147                 
     
    181183         
    182184        CloseAVCodec(); 
     185         
     186        avContext->extradata_size = 0; 
     187        avContext->extradata = NULL; 
    183188} 
    184189 
     
    201206                         
    202207                case kAudioFormatXiphVorbis: 
    203                         avContext->extradata_size = ConvertXiphVorbisCookie(); 
    204                         avContext->extradata = magicCookie; 
     208                        if (!avContext->extradata) { 
     209                                avContext->extradata_size = ConvertXiphVorbisCookie(); 
     210                                avContext->extradata = magicCookie; 
     211                        } 
    205212                        break; 
    206213                         
     
    251258         
    252259        int len = headerSize[0] + headerSize[1] + headerSize[2]; 
    253         Byte *newCookie = new Byte[len + len/255 + 64]; 
     260        Byte *newCookie = new Byte[len + len/255 + 64 + FF_INPUT_BUFFER_PADDING_SIZE]; 
    254261        ptr = newCookie; 
    255262         
     
    336343        CodecID codecID = GetCodecID(mInputFormat.mFormatID); 
    337344        avCodec = avcodec_find_decoder(codecID); 
    338          
    339         avcodec_get_context_defaults2(avContext, CODEC_TYPE_AUDIO); 
    340345         
    341346        avContext->sample_rate = mInputFormat.mSampleRate; 
  • branches/perian-1.2/MatroskaImportPrivate.cpp

    r1216 r1237  
    235235ComponentResult MatroskaImport::ReadTracks(KaxTracks &trackEntries) 
    236236{ 
    237         Track firstVideoTrack = NULL; 
    238         Track firstAudioTrack = NULL; 
    239         Track firstSubtitleTrack = NULL; 
     237        Track firstVideoTrack = NULL; short firstVideoTrackLang = 0; 
     238        Track firstAudioTrack = NULL; short firstAudioTrackLang = 0; 
     239        Track firstSubtitleTrack = NULL; short firstSubtitleTrackLang = 0; 
    240240        ComponentResult err = noErr; 
     241        bool foundAnEnabledTrack = false; 
    241242         
    242243        if (seenTracks) 
     
    262263                        mkvTrack.defaultDuration = uint32(defaultDuration) / float(timecodeScale) + .5; 
    263264                         
     265                        KaxTrackLanguage & trackLang = GetChild<KaxTrackLanguage>(track); 
     266                        KaxTrackName & trackName = GetChild<KaxTrackName>(track); 
     267                        KaxContentEncodings * encodings = FindChild<KaxContentEncodings>(track); 
     268                         
     269                        short qtLang = ISO639_2ToQTLangCode(string(trackLang).c_str()); 
     270                        SetMediaLanguage(mkvTrack.theMedia, qtLang); 
     271                         
    264272                        switch (uint8(type)) { 
    265273                                case track_video: 
     
    268276                                        if (err) return err; 
    269277                                         
    270                                         if (firstVideoTrack) 
     278                                        if (firstVideoTrack && qtLang != firstVideoTrackLang) 
    271279                                                SetTrackAlternate(firstVideoTrack, mkvTrack.theTrack); 
    272                                         else 
     280                                        else { 
    273281                                                firstVideoTrack = mkvTrack.theTrack; 
     282                                                firstVideoTrackLang = qtLang; 
     283                                        } 
    274284                                        break; 
    275285                                         
     
    279289                                        if (err) return err; 
    280290                                         
    281                                         if (firstAudioTrack) 
     291                                        if (firstAudioTrack && qtLang != firstAudioTrackLang) 
    282292                                                SetTrackAlternate(firstAudioTrack, mkvTrack.theTrack); 
    283                                         else 
     293                                        else { 
    284294                                                firstAudioTrack = mkvTrack.theTrack; 
     295                                                firstAudioTrackLang = qtLang; 
     296                                        } 
    285297                                        break; 
    286298                                         
     
    291303                                        if (mkvTrack.theTrack == NULL) continue; 
    292304                                         
    293                                         if (firstSubtitleTrack) 
     305                                        if (firstSubtitleTrack && qtLang != firstSubtitleTrackLang) 
    294306                                                SetTrackAlternate(firstSubtitleTrack, mkvTrack.theTrack); 
    295                                         else 
     307                                        else { 
    296308                                                firstSubtitleTrack = mkvTrack.theTrack; 
     309                                                firstSubtitleTrackLang = qtLang; 
     310                                        } 
    297311                                        break; 
    298312                                         
     
    306320                        } 
    307321                         
    308                         KaxTrackLanguage & trackLang = GetChild<KaxTrackLanguage>(track); 
    309                         KaxTrackName & trackName = GetChild<KaxTrackName>(track); 
    310                         KaxContentEncodings * encodings = FindChild<KaxContentEncodings>(track); 
     322                        mkvTrack.isEnabled = uint8(enabled); 
     323                        mkvTrack.usesLacing = uint8(lacing); 
    311324                         
    312325                        if (encodings) { 
     
    315328                                if (err) continue; 
    316329                        } 
    317                          
    318                         long qtLang = ISO639_2ToQTLangCode(string(trackLang).c_str()); 
    319                         SetMediaLanguage(mkvTrack.theMedia, qtLang); 
    320                          
    321                         mkvTrack.isEnabled = uint8(enabled); 
    322                         mkvTrack.usesLacing = uint8(lacing); 
    323330                         
    324331                        if (!trackName.IsDefaultValue()) { 
     
    355362        for (int i = 0; i < tracks.size(); i++) { 
    356363                SetTrackEnabled(tracks[i].theTrack, tracks[i].isEnabled); 
    357         } 
    358         // ensure that at least one track in each alternate group (type) is enabled 
     364                if (tracks[i].isEnabled) 
     365                        foundAnEnabledTrack = true; 
     366        } 
    359367        // ffmpeg used to write a TrackDefault of 0 for all tracks 
    360         for (int i = 0; i < tracks.size(); i++) { 
    361                 if (!GetTrackEnabled(tracks[i].theTrack)) { 
    362                         Track alternate = GetTrackAlternate(tracks[i].theTrack); 
    363                         while (alternate != tracks[i].theTrack && !GetTrackEnabled(alternate)) 
    364                                 alternate = GetTrackAlternate(alternate); 
    365                         if (alternate == tracks[i].theTrack) 
    366                                 SetTrackEnabled(tracks[i].theTrack, 1); 
    367                 } 
    368         } 
     368        // ensure that at least one track of each media type is enabled, if none were originally 
     369        // this picks the first track, which may not be the best, but the situation is quite rare anyway 
     370        if (!foundAnEnabledTrack) { 
     371                if (firstVideoTrack) 
     372                        SetTrackEnabled(firstVideoTrack, 1); 
     373                if (firstAudioTrack) 
     374                        SetTrackEnabled(firstAudioTrack, 1); 
     375                if (firstSubtitleTrack) 
     376                        SetTrackEnabled(firstSubtitleTrack, 1); 
     377        } 
     378         
    369379        seenTracks = true; 
    370380        return noErr; 
     
    626636                 
    627637                PtrAndHand(&emptyDataRefExtension[0], mkvTrack.subDataRefHandler, sizeof(emptyDataRefExtension)); 
    628                                  
     638 
    629639                mkvTrack.theTrack = CreatePlaintextSubTrack(theMovie, imgDesc, GetMovieTimeScale(theMovie), mkvTrack.subDataRefHandler, HandleDataHandlerSubType, (*imgDesc)->cType, NULL, movieBox); 
    630640                if (mkvTrack.theTrack == NULL) 
  • branches/perian-1.2/Subtitles/SubImport.mm

    r1202 r1237  
    7171static void AppendSRGBProfile(ImageDescriptionHandle imgDesc) 
    7272{ 
     73        if (!(*CGColorSpaceCopyICCProfile)) 
     74                return; //10.4 weak symbol check 
     75         
    7376        CGColorSpaceRef cSpace = GetSRGBColorSpace(); 
    7477        CFDataRef cSpaceICC = CGColorSpaceCopyICCProfile(cSpace);