Changeset 69

Show
Ignore:
Timestamp:
08/22/06 22:26:00 (2 years ago)
Author:
dconrad
Message:

Some support for FLV importing and decoding.

Files:

Legend:

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

    r66 r69  
    119119void ChangeHintText(int value, ControlRef staticTextField); 
    120120 
     121extern void initLib(); 
     122 
    121123//--------------------------------------------------------------------------- 
    122124// Component Dispatcher 
     
    398400    if (!glob->avCodec) 
    399401    { 
    400         avcodec_init(); 
    401         register_avcodec(&msmpeg4v1_decoder); 
    402         register_avcodec(&msmpeg4v2_decoder); 
    403         register_avcodec(&msmpeg4v3_decoder); 
    404         register_avcodec(&mpeg4_decoder); 
    405                 register_avcodec(&h264_decoder); 
    406                 av_log_set_callback(FFMpegCodecprintf); 
     402                initLib(); 
    407403                 
    408404        switch (glob->componentType) 
     
    474470                        case 'VSSH': 
    475471                                glob->avCodec = avcodec_find_decoder(CODEC_ID_H264); 
     472                                break; 
     473                        case 'FLV1': 
     474                                glob->avCodec = avcodec_find_decoder(CODEC_ID_FLV1); 
    476475                                break; 
    477476            default: 
     
    11511150                                break; 
    11521151                                 
     1152                        case 'FLV1': 
     1153                                err = GetComponentResource((Component)glob->self, codecInfoResourceType, kFLV1CodecInfoResID, (Handle *)&tempCodecInfo); 
     1154                                break; 
     1155                                 
    11531156            default:    // should never happen but we have to handle the case 
    11541157                err = GetComponentResource((Component)glob->self, codecInfoResourceType, kDivX4CodecInfoResID, (Handle *)&tempCodecInfo); 
  • trunk/FFusionCodec.h

    r56 r69  
    3636#define kDivX4CodecInfoResID            259 
    3737#define kDivX5CodecInfoResID            260 
    38 #define k3ivxCodecInfoResID             261 
    39 #define kXVIDCodecInfoResID             262 
    40 #define kMPEG4CodecInfoResID    263 
    41 #define kH264CodecInfoResID             264 
     38#define k3ivxCodecInfoResID                     261 
     39#define kXVIDCodecInfoResID                     262 
     40#define kMPEG4CodecInfoResID            263 
     41#define kH264CodecInfoResID                     264 
     42#define kFLV1CodecInfoResID                     265 
    4243 
    4344#define kFFusionCodecManufacturer       'SNE2' 
  • trunk/FFusionCodec.r

    r56 r69  
    5353#define kMPEG4Name              "MPEG-4 Video" 
    5454#define kH264Name               "H.264" 
     55#define kFLV1Name               "Sorenson H.263" 
    5556 
    5657// Codec names Resource ID 
     
    6566#define kMPEG4NameResID         263 
    6667#define kH264NameResID          264 
     68#define kFLV1NameResID          265 
    6769 
    6870// Codec infos Resource ID 
     
    7779#define kMPEG4InfoResID         292 
    7880#define kH264InfoResID          293 
     81#define kFLV1InfoResID          294 
    7982 
    8083// These flags specify information about the capabilities of the component 
     
    315318 
    316319//--------------------------------------------------------------------------- 
     320// Flash Video Description Resources 
     321//--------------------------------------------------------------------------- 
     322 
     323resource 'cdci' (kFLV1CodecInfoResID) { 
     324        kFLV1Name,                              // Type 
     325        1,                                      // Version 
     326        1,                                      // Revision level 
     327        kFFusionCodecManufacturer,                      // Manufacturer 
     328        kFFusionDecompressionFlags,             // Decompression Flags 
     329        0,                                      // Compression Flags 
     330        kFFusionFormatFlags,                    // Format Flags 
     331        128,                                    // Compression Accuracy 
     332        128,                                    // Decomression Accuracy 
     333        200,                                    // Compression Speed 
     334        200,                                    // Decompression Speed 
     335        128,                                    // Compression Level 
     336        0,                                      // Reserved 
     337        1,                                      // Minimum Height 
     338        1,                                      // Minimum Width 
     339        0,                                      // Decompression Pipeline Latency 
     340        0,                                      // Compression Pipeline Latency 
     341        0                                       // Private Data 
     342}; 
     343 
     344//--------------------------------------------------------------------------- 
    317345// MS-MPEG4 v1 Component 
    318346//--------------------------------------------------------------------------- 
     
    19671995}; 
    19681996 
     1997resource 'thng' (310) { 
     1998        decompressorComponentType,              // Type                  
     1999        'FLV1',                                 // SubType 
     2000        kFFusionCodecManufacturer,                      // Manufacturer 
     2001        0,                                      // - use componentHasMultiplePlatforms 
     2002        0, 
     2003        0, 
     2004        0, 
     2005        'STR ',                                 // Name Type 
     2006        kFLV1NameResID,                 // Name ID 
     2007        'STR ',                                 // Info Type 
     2008        kFLV1InfoResID,                 // Info ID 
     2009        0,                                      // Icon Type 
     2010        0,                                      // Icon ID 
     2011        kFFusionCodecVersion,                   // Version 
     2012        componentHasMultiplePlatforms +         // Registration Flags  
     2013        componentDoAutoVersion,                 // Registration Flags 
     2014        0,                                      // Resource ID of Icon Family 
     2015{ 
     2016        kFFusionDecompressionFlags,  
     2017        'dlle',                         // Entry point found by symbol name 'dlle' resource 
     2018        256,                            // ID of 'dlle' resource 
     2019        platformPowerPCNativeEntryPoint, 
     2020        kFFusionDecompressionFlags, 
     2021        'dlle', 
     2022        256, 
     2023        platformIA32NativeEntryPoint, 
     2024}; 
     2025}; 
     2026 
    19692027//--------------------------------------------------------------------------- 
    19702028// Component Name Resources 
     
    20072065}; 
    20082066 
     2067resource 'STR ' (kFLV1NameResID) { 
     2068        "Sorenson H.263 Decoder" 
     2069}; 
     2070 
    20092071//--------------------------------------------------------------------------- 
    20102072// Component Name Resources 
     
    20472109}; 
    20482110 
     2111resource 'STR ' (kFLV1InfoResID) { 
     2112        "Decompresses video stored in Sorenson H.263 format." 
     2113}; 
     2114 
    20492115//--------------------------------------------------------------------------- 
    20502116// Code Entry Point for Mach-O 
  • trunk/PerianAviImporter.r

    r60 r69  
    3838                | cmpThreadSafe ) 
    3939 
    40  
    41 /* Component Manager Things: 
    42 * The Component Manager alias doesn't seem to work so we have 
    43 * More than one thing  
    44 */ 
    45 resource 'thng' (512) { 
     40/* Component Manager Things -  
     41        AVI */ 
     42resource 'thng' (kAVIthngResID) { 
    4643        'eat ',                                 // Type 
    4744        'VfW ',                                 // SubType 
     
    5249        0, 
    5350        'STR ',                                         // Name Type 
    54         512,                                          // Name ID 
     51        kAVIthngResID,                                                // Name ID 
    5552        0,                                                      // Info Type 
    5653        0,                                                      // Info ID 
     
    7168        platformPowerPCNativeEntryPoint,        // PowerPC 
    7269}, 
    73 'thnr', 512 
     70'thnr', kAVIthngResID 
    7471}; 
    7572 
     
    8380        0, 
    8481        'STR ',                                         // Name Type 
    85         512,                                          // Name ID 
     82        kAVIthngResID,                                                // Name ID 
    8683        0,                                                      // Info Type 
    8784        0,                                                      // Info ID 
     
    9491        0,                                                      // Component Flags 
    9592        0,                                                      // Component Flags Mask 
    96         'thnr', 512,                          // Component public resource identifier 
     93        'thnr', kAVIthngResID,                                // Component public resource identifier 
    9794        cmpAliasOnlyThisFile 
    9895}; 
     
    107104        0, 
    108105        'STR ',                                         // Name Type 
    109         512,                                          // Name ID 
     106        kAVIthngResID,                                                // Name ID 
    110107        0,                                                      // Info Type 
    111108        0,                                                      // Info ID 
     
    118115        0,                                                      // Component Flags 
    119116        0,                                                      // Component Flags Mask 
    120         'thnr', 512,                          // Component public resource identifier 
     117        'thnr', kAVIthngResID,                                // Component public resource identifier 
    121118        cmpAliasOnlyThisFile 
    122119}; 
    123120 
    124  
    125121/* Perhaps in a later version, we have to use "QuickTime Media Configuration Resources" */ 
    126 resource 'thnr' (512) { 
     122resource 'thnr' (kAVIthngResID) { 
    127123{ 
    128124        'mime', 1, 0, 
    129         'mime', 512, 0, 
     125        'mime', kAVIthngResID, 0, 
    130126} 
    131127}; 
    132128 
    133 resource 'mime' (512) { 
     129resource 'mime' (kAVIthngResID) { 
    134130{ 
    135131        kMimeInfoMimeTypeTag,           1,      "video/x-msvideo"; 
     
    145141}; 
    146142 
    147 resource 'STR ' (512) { 
     143resource 'STR ' (kAVIthngResID) { 
    148144        "FFAvi Movie Importer" 
     145}; 
     146 
     147 
     148/* Component Manager Things -  
     149        FLV */ 
     150resource 'thng' (kFLVthngResID) { 
     151        'eat ',                                 // Type 
     152        'FLV ',                                 // SubType 
     153        'vide',                                 // Manufacturer 
     154        0, 
     155        0, 
     156        0, 
     157        0, 
     158        'STR ',                                         // Name Type 
     159        kFLVthngResID,                                          // Name ID 
     160        0,                                                      // Info Type 
     161        0,                                                      // Info ID 
     162        0,                                                      // Icon Type 
     163        0,                                                      // Icon ID 
     164        kFFAviComponentVersion,         // Version 
     165        componentHasMultiplePlatforms + 
     166        componentDoAutoVersion,         // Registratin Flags 
     167        0,                                                      // Resource ID of Icon Family 
     168{ 
     169        kFFAvi_MovieImportFlags | movieImportSubTypeIsFileExtension, 
     170        'dlle',                                 // Code Resource type 
     171        512, 
     172        platformIA32NativeEntryPoint,           // IA32 
     173        kFFAvi_MovieImportFlags | movieImportSubTypeIsFileExtension, 
     174        'dlle', 
     175        512, 
     176        platformPowerPCNativeEntryPoint,        // PowerPC 
     177}, 
     178'thnr', kFLVthngResID 
     179}; 
     180 
     181resource 'thnr' (kFLVthngResID) { 
     182{ 
     183        'mime', 1, 0, 
     184        'mime', kFLVthngResID, 0, 
     185} 
     186}; 
     187 
     188resource 'mime' (kFLVthngResID) { 
     189{ 
     190        kMimeInfoMimeTypeTag,           1, "video/x-flv"; 
     191        kMimeInfoFileExtensionTag,      1, "flv"; 
     192        kMimeInfoDescriptionTag,        1, "Flash Video"; 
     193}; 
     194}; 
     195 
     196resource 'STR ' (kFLVthngResID) { 
     197        "Flash Video Importer" 
    149198}; 
    150199 
  • trunk/ff_MovieImport.c

    r67 r69  
    4444struct _ff_global_context { 
    4545        ComponentInstance ci; 
     46        OSType componentType; 
    4647         
    4748        /* For feedback during import */ 
     
    7576                inited = TRUE; 
    7677                av_register_input_format(&avi_demuxer); 
     78                av_register_input_format(&flv_demuxer); 
    7779                register_parsers(); 
     80                 
     81                avcodec_init(); 
     82                register_avcodec(&msmpeg4v1_decoder); 
     83                register_avcodec(&msmpeg4v2_decoder); 
     84                register_avcodec(&msmpeg4v3_decoder); 
     85                register_avcodec(&mpeg4_decoder); 
     86                register_avcodec(&h264_decoder); 
     87                register_avcodec(&flv_decoder); 
     88                 
    7889                av_log_set_callback(FFMpegCodecprintf); 
    7990        } 
     
    8798{ 
    8899        ComponentResult result; 
     100    ComponentDescription descout; 
    89101         
    90102        /* Check for Mac OS 10.4 & QT 7 */ 
     
    92104        require_noerr(result,bail); 
    93105         
     106    GetComponentInfo((Component)self, &descout, 0, 0, 0); 
     107         
    94108        storage = malloc(sizeof(ff_global_context)); 
    95109        if(!storage) goto bail; 
     
    100114        SetComponentInstanceStorage(storage->ci, (Handle)storage); 
    101115         
     116        storage->componentType = descout.componentSubType; 
    102117bail: 
    103118                return result; 
     
    131146ComponentResult FFAvi_MovieImportGetMIMETypeList(ff_global_ptr storage, QTAtomContainer *mimeInfo) 
    132147{ 
    133         return GetComponentResource((Component)storage->ci, 'mime', 512, (Handle*)mimeInfo); 
     148        ComponentResult err = noErr; 
     149        switch (storage->componentType) { 
     150                case 'VfW ': 
     151                case 'VFW ': 
     152                case 'AVI ': 
     153                        err = GetComponentResource((Component)storage->ci, 'mime', kAVIthngResID, (Handle*)mimeInfo); 
     154                        break; 
     155                case 'FLV ': 
     156                        err = GetComponentResource((Component)storage->ci, 'mime', kFLVthngResID, (Handle*)mimeInfo); 
     157                        break; 
     158                default: 
     159                        err = GetComponentResource((Component)storage->ci, 'mime', kAVIthngResID, (Handle*)mimeInfo); 
     160                        break; 
     161        } 
     162        return err; 
    134163} /* FFAvi_MovieImportGetMIMETypeList() */ 
    135164 
     
    328357        if(ic->streams[0]->index_entries == NULL) 
    329358        { 
    330                 //Try to seek to the first frame; don't care if it fails 
    331                 av_seek_frame(ic, -1, 0, 0); 
     359                if (storage->componentType == 'AVI ' || storage->componentType == 'VfW ' || storage->componentType == 'VFW ') 
     360                        //Try to seek to the first frame; don't care if it fails 
     361                        // Is this really needed for AVIs w/out an index? It seems to work fine without,  
     362                        // and it seems that with it the first frame is skipped. 
     363                        av_seek_frame(ic, -1, 0, 0); 
    332364                dataOffset = 0; 
    333365        } 
  • trunk/ff_MovieImportVersion.h

    r20 r69  
    2828#define kChristophManufacturer 'Rafz' 
    2929 
     30#define kAVIthngResID 512 
     31#define kFLVthngResID 515 
     32 
    3033#endif 
  • trunk/ff_private.c

    r68 r69  
    142142        imgHdl = (ImageDescriptionHandle)NewHandleClear(sizeof(ImageDescription)); 
    143143        (*imgHdl)->idSize = sizeof(ImageDescription); 
    144         Codecprintf(NULL, "fourcc: %c%c%c%c\n",0xff & (codec->codec_tag),0xff & (codec->codec_tag)>>8,0xff & (codec->codec_tag)>>16,0xff & (codec->codec_tag)>>24); 
    145         (*imgHdl)->cType = BSWAP(codec->codec_tag); 
     144         
     145        if (codec->codec_tag) 
     146                (*imgHdl)->cType = BSWAP(codec->codec_tag); 
     147        else 
     148                // need to lookup the fourcc from the codec_id 
     149                (*imgHdl)->cType = map_video_codec_to_mov_tag(codec->codec_id); 
     150        Codecprintf(NULL, "fourcc: %c%c%c%c\n",0xff & (*imgHdl)->cType,0xff & (*imgHdl)->cType>>8,0xff & (*imgHdl)->cType>>16,0xff & (*imgHdl)->cType>>24); 
     151         
    146152        (*imgHdl)->temporalQuality = codecMaxQuality; 
    147153        (*imgHdl)->spatialQuality = codecMaxQuality; 
     
    195201        asbd.mBitsPerChannel = codec->bits_per_sample; 
    196202         
     203        // this probably isn't quite right; FLV doesn't set frame_size or block_align,  
     204        // but we need > 0 frames per packet or Apple's mp3 decoder won't work 
     205        if (asbd.mBytesPerPacket == 0 && asbd.mFramesPerPacket == 0) 
     206                asbd.mFramesPerPacket = 1; 
     207         
    197208        /* ask the toolbox about more information */ 
    198209        ioSize = sizeof(AudioStreamBasicDescription); 
     
    239250        map->asbd = asbd; 
    240251} /* initialize_audio_map() */ 
     252 
     253OSType map_video_codec_to_mov_tag(enum CodecID codec_id) 
     254{ 
     255        switch(codec_id) { 
     256                case CODEC_ID_FLV1: 
     257                        return 'FLV1'; 
     258        } 
     259        return 0; 
     260} 
    241261 
    242262/* maps the codec_id tag of libavformat to a constant the AudioToolbox can work with */ 
  • trunk/ff_private.h

    r68 r69  
    5858void import_avi(AVFormatContext *ic, NCStream *map, int64_t aviheader_offset); 
    5959 
     60OSType map_video_codec_to_mov_tag(enum CodecID codec_id); 
    6061void map_avi_to_mov_tag(enum CodecID codec_id, AudioStreamBasicDescription *asbd); 
    6162uint8_t *create_cookie(AVCodecContext *codec, int *cookieSize, UInt32 formatID);