Changeset 256

Show
Ignore:
Timestamp:
01/06/07 18:12:59 (2 years ago)
Author:
gbooker
Message:

Use the first packet bitstream to determine audio parameters. Now we need to add other formats.

Files:

Legend:

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

    r242 r256  
    573573}; 
    574574 
     575extern "C"{ 
    575576 
    576577AudioChannelLayout GetDefaultChannelLayout(AudioStreamBasicDescription *asbd) 
     
    598599         
    599600        return acl; 
     601} 
     602 
    600603} 
    601604 
  • trunk/MatroskaCodecIDs.h

    r242 r256  
    5353ComponentResult MkvFinishASBD(KaxTrackEntry *tr_entry, AudioStreamBasicDescription *asbd); 
    5454FourCharCode GetFourCC(KaxTrackEntry *tr_entry); 
     55extern "C"{ 
    5556AudioChannelLayout GetDefaultChannelLayout(AudioStreamBasicDescription *asbd); 
    56  
     57
    5758#endif 
  • trunk/Perian.xcodeproj/project.pbxproj

    r253 r256  
    214214                8F483B5E0A6426C1002CCA73 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F483B5D0A6426C1002CCA73 /* AudioToolbox.framework */; }; 
    215215                8F483B8C0A642886002CCA73 /* PerianAviImporter.r in Rez */ = {isa = PBXBuildFile; fileRef = 8F483B8B0A642886002CCA73 /* PerianAviImporter.r */; }; 
     216                F52286260B50625E00F8CF7D /* bitstream_info.c in Sources */ = {isa = PBXBuildFile; fileRef = F52286250B50625E00F8CF7D /* bitstream_info.c */; }; 
    216217                F53E18E50B4F483C003A0471 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F53E18E40B4F483C003A0471 /* Security.framework */; }; 
    217218                F59E09F10A670E570019A3F0 /* Perian.component in CopyFiles */ = {isa = PBXBuildFile; fileRef = 11A70AC10A3D0105002058D4 /* Perian.component */; }; 
     
    540541                8F483BBC0A642B3D002CCA73 /* ff_MovieImportDispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ff_MovieImportDispatch.h; sourceTree = "<group>"; }; 
    541542                F50D440703EAD8DF01B1D299 /* FFusion.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = FFusion.icns; sourceTree = "<group>"; }; 
     543                F52286240B50625E00F8CF7D /* bitstream_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitstream_info.h; sourceTree = "<group>"; }; 
     544                F52286250B50625E00F8CF7D /* bitstream_info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitstream_info.c; sourceTree = "<group>"; }; 
    542545                F53E18E40B4F483C003A0471 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; }; 
    543546                F560DECD03D61B6101ABA332 /* Components.k.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Components.k.h; sourceTree = "<group>"; }; 
     
    546549                F560DF0003D61D0101ABA332 /* FFusionCodec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = FFusionCodec.c; sourceTree = "<group>"; }; 
    547550                F560DF0203D622D001ABA332 /* FFusionCodec.r */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.rez; path = FFusionCodec.r; sourceTree = "<group>"; }; 
    548                 F5CFD1B40B50009000616865 /* PerianPanePListGenerator */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = PerianPanePListGenerator; sourceTree = BUILT_PRODUCTS_DIR; }; 
     551                F5CFD1B40B50009000616865 /* PerianPanePListGenerator */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = PerianPanePListGenerator; sourceTree = BUILT_PRODUCTS_DIR; }; 
    549552                F5CFD1BC0B5000CE00616865 /* GBPerianPanePListGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GBPerianPanePListGenerator.h; sourceTree = "<group>"; }; 
    550553                F5CFD1BD0B5000CE00616865 /* GBPerianPanePListGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GBPerianPanePListGenerator.m; sourceTree = "<group>"; }; 
     
    943946                                11C85ED60A641E6400DF3D73 /* ff_private.c */, 
    944947                                11C85ED70A641E6400DF3D73 /* ff_private.h */, 
     948                                F52286240B50625E00F8CF7D /* bitstream_info.h */, 
     949                                F52286250B50625E00F8CF7D /* bitstream_info.c */, 
    945950                        ); 
    946951                        name = "File Import"; 
     
    962967                                F5CFD2D60B5012A100616865 /* A52Codec.component */, 
    963968                                F5CFD2D80B5012A100616865 /* AC3MovieImport.component */, 
    964                                 F5CFD2DA0B5012A100616865 /* Preferences.app */, 
     969                                F5CFD2DA0B5012A100616865 /* A52Preferences.app */, 
    965970                        ); 
    966971                        name = Products; 
     
    11771182                        sourceTree = BUILT_PRODUCTS_DIR; 
    11781183                }; 
    1179                 F5CFD2DA0B5012A100616865 /* Preferences.app */ = { 
     1184                F5CFD2DA0B5012A100616865 /* A52Preferences.app */ = { 
    11801185                        isa = PBXReferenceProxy; 
    11811186                        fileType = wrapper.application; 
    1182                         path = Preferences.app; 
     1187                        path = A52Preferences.app; 
    11831188                        remoteRef = F5CFD2D90B5012A100616865 /* PBXContainerItemProxy */; 
    11841189                        sourceTree = BUILT_PRODUCTS_DIR; 
     
    13191324                                6116E6220B44A5BC0020F1CE /* CABundleLocker.cpp in Sources */, 
    13201325                                61FD41330B4F6F0800BEEFEA /* MatroskaImportPrivate.cpp in Sources */, 
     1326                                F52286260B50625E00F8CF7D /* bitstream_info.c in Sources */, 
    13211327                        ); 
    13221328                        runOnlyForDeploymentPostprocessing = 0; 
     
    14781484                                ); 
    14791485                                COPY_PHASE_STRIP = NO; 
    1480                                 DEAD_CODE_STRIPPING = YES
     1486                                DEAD_CODE_STRIPPING = NO
    14811487                                EXPORTED_SYMBOLS_FILE = "$(SOURCE_ROOT)/exportedSymbols"; 
    14821488                                FRAMEWORK_SEARCH_PATHS = ( 
     
    15181524                                OTHER_REZFLAGS = "-rd -d ppc_$(ppc) -d i386_$(i386) -d TARGET_REZ_CARBON_MACHO=1"; 
    15191525                                PREBINDING = NO; 
    1520                                 PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES
     1526                                PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO
    15211527                                PRODUCT_NAME = Perian; 
    15221528                                REZ_PREPROCESSOR_DEFINITIONS = ""; 
  • trunk/ff_MovieImport.c

    r243 r256  
    418418        if(inFlags & movieImportMustUseTrack) { 
    419419                storage->map_count = 1; 
    420                 prepare_track(ic, &storage->stream_map, targetTrack, dataRef, dataRefType); 
     420                prepare_track(storage, targetTrack, dataRef, dataRefType); 
    421421        } else { 
    422422                storage->map_count = ic->nb_streams; 
    423                 prepare_movie(ic, &storage->stream_map, theMovie, dataRef, dataRefType); 
     423                prepare_movie(storage, theMovie, dataRef, dataRefType); 
    424424        } 
    425425         
  • trunk/ff_private.c

    r255 r256  
    3232#include <QuickTime/QuickTime.h> 
    3333 
     34#include "bitstream_info.h" 
     35 
    3436/* This routine checks if the system requirements are fullfilled */ 
    3537ComponentResult check_system() 
     
    6668 *      < 0: couldn't find a matching track 
    6769 */ 
    68 int prepare_track(AVFormatContext *ic, NCStream **out_map, Track targetTrack, Handle dataRef, OSType dataRefType) 
     70int prepare_track(ff_global_ptr storage, Track targetTrack, Handle dataRef, OSType dataRefType) 
    6971{ 
    7072        int j; 
     
    7375        Media media; 
    7476        NCStream *map = NULL; 
     77        AVFormatContext *ic = storage->format_context; 
    7578         
    7679        /* If the track has already a media, return an err */ 
     
    99102         
    100103        if(st->codec->codec_type == CODEC_TYPE_VIDEO) 
    101                 initialize_video_map(map, targetTrack, dataRef, dataRefType); 
     104                initialize_video_map(map, targetTrack, dataRef, dataRefType, storage->firstFrames + st->index); 
    102105        else if(st->codec->codec_type == CODEC_TYPE_AUDIO) 
    103                 initialize_audio_map(map, targetTrack, dataRef, dataRefType); 
     106                initialize_audio_map(map, targetTrack, dataRef, dataRefType, storage->firstFrames + st->index); 
    104107         
    105108        /* return the map */ 
    106         *out_map = map; 
     109        storage->stream_map = map; 
    107110         
    108111        return 0; 
     
    114117 
    115118/* Initializes the map & targetTrack to receive video data */ 
    116 void initialize_video_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType
     119void initialize_video_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType, AVPacket *firstFrame
    117120{ 
    118121        Media media; 
     
    174177 
    175178/* Initializes the map & targetTrack to receive audio data */ 
    176 void initialize_audio_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType
     179void initialize_audio_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType, AVPacket *firstFrame
    177180{ 
    178181        Media media; 
     
    243246        int aclSize = 0;  //Set this if you intend to use it 
    244247        memset(&acl, 0, sizeof(AudioChannelLayout)); 
    245         if(asbd.mChannelsPerFrame > 2) 
     248 
     249        /* We have to parse the format */ 
     250        int useDefault = 1; 
     251        if(asbd.mFormatID == 'ac-3' || asbd.mFormatID == 'ms \0') 
    246252        { 
    247                 /* We have to just guess what layout to use.  People, add them here: */ 
    248                 if((asbd.mFormatID == 'ac-3' || asbd.mFormatID == 'ms \0') && asbd.mChannelsPerFrame == 5) 
     253                if(parse_ac3_bitstream(&asbd, &acl, firstFrame->data, firstFrame->size)) 
    249254                { 
    250                         /* likely really 5.1, but not absolutely sure.  guess it is, can't do any better */ 
    251                         asbd.mChannelsPerFrame++; 
    252                         acl.mChannelLayoutTag = kAudioChannelLayoutTag_ITU_3_2_1; 
     255                        useDefault = 0; 
    253256                        aclSize = sizeof(AudioChannelLayout); 
    254257                } 
     258        } 
     259        if(useDefault && asbd.mChannelsPerFrame > 2) 
     260        { 
     261                acl.mChannelLayoutTag = GetDefaultChannelLayout(); 
     262                aclSize = sizeof(AudioChannelLayout); 
    255263        } 
    256264        err = QTSoundDescriptionCreate(&asbd, aclSize == 0 ? NULL : &acl, aclSize, NULL, 0, kQTSoundDescriptionKind_Movie_Version2, &sndHdl); 
     
    483491 *        0: ok 
    484492 */ 
    485 int prepare_movie(AVFormatContext *ic, NCStream **out_map, Movie theMovie, Handle dataRef, OSType dataRefType) 
     493int prepare_movie(ff_global_ptr storage, Movie theMovie, Handle dataRef, OSType dataRefType) 
    486494{ 
    487495        int j; 
     
    490498        Track track; 
    491499        Track first_audio_track = NULL; 
     500        AVFormatContext *ic = storage->format_context; 
    492501         
    493502        /* make the stream map structure */ 
     
    502511                if(st->codec->codec_type == CODEC_TYPE_VIDEO) { 
    503512                        track = NewMovieTrack(theMovie, st->codec->width << 16, st->codec->height << 16, kNoVolume); 
    504                         initialize_video_map(&map[j], track, dataRef, dataRefType); 
     513                        initialize_video_map(&map[j], track, dataRef, dataRefType, storage->firstFrames + j); 
    505514                } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { 
    506515                        track = NewMovieTrack(theMovie, 0, 0, kFullVolume); 
    507                         initialize_audio_map(&map[j], track, dataRef, dataRefType); 
     516                        initialize_audio_map(&map[j], track, dataRef, dataRefType, storage->firstFrames + j); 
    508517                         
    509518                        if (first_audio_track == NULL) 
     
    516525    add_metadata(ic, theMovie); 
    517526     
    518         *out_map = map; 
     527        storage->stream_map = map; 
    519528         
    520529        return 0; 
     
    542551        else 
    543552        { 
     553                int streamsRead = 0; 
    544554                result = av_seek_frame(formatContext, -1, 0, 0); 
    545555                if(result < 0) goto bail; 
     
    554564                        } 
    555565                } 
    556                 av_free_packet(&packet); 
     566                while(streamsRead < formatContext->nb_streams) 
     567                { 
     568                        int streamIndex = packet.stream_index; 
     569                        if(storage->firstFrames[streamIndex].size == 0) 
     570                        { 
     571                                memcpy(storage->firstFrames + streamIndex, &packet, sizeof(AVPacket)); 
     572                                streamsRead++; 
     573                                if(streamsRead == formatContext->nb_streams) 
     574                                        break; 
     575                        } 
     576                        else 
     577                                av_free_packet(&packet); 
     578                        formatContext->iformat->read_packet(formatContext, &packet); 
     579                } 
    557580                 
    558581                // seek back to the beginning, otherwise av_read_frame-based decoding will skip a few packets. 
  • trunk/ff_private.h

    r221 r256  
    7777        int map_count; 
    7878        int64_t header_offset; 
     79         
     80        AVPacket firstFrames[MAX_STREAMS]; 
    7981}; 
    8082typedef struct _ff_global_context ff_global_context; 
     
    9193 
    9294/* Import routines */ 
    93 int prepare_track(AVFormatContext *ic, NCStream **out_map, Track targetTrack, Handle dataRef, OSType dataRefType); 
    94 int prepare_movie(AVFormatContext *ic, NCStream **out_map, Movie theMovie, Handle dataRef, OSType dataRefType); 
    95 void initialize_video_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType); 
    96 void initialize_audio_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType); 
     95int prepare_track(ff_global_ptr storage, Track targetTrack, Handle dataRef, OSType dataRefType); 
     96int prepare_movie(ff_global_ptr storage, Movie theMovie, Handle dataRef, OSType dataRefType); 
     97void initialize_video_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType, AVPacket *firstFrame); 
     98void initialize_audio_map(NCStream *map, Track targetTrack, Handle dataRef, OSType dataRefType, AVPacket *firstFrame); 
    9799 
    98100int determine_header_offset(ff_global_ptr storage);