Changeset 1256

Show
Ignore:
Timestamp:
01/30/10 10:32:34 (1 month ago)
Author:
gbooker
Message:

Added parsers to audio decoding so we can handle badly packetized data in files created by those who don't understand how to do it correctly

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/FFissionCodec/FFissionDecoder.cpp

    r1246 r1256  
    130130         
    131131        avcodec_get_context_defaults2(avContext, CODEC_TYPE_AUDIO); 
     132        parser = NULL; 
    132133} 
    133134 
     
    388389                } 
    389390        } 
     391        parser = av_parser_init(codecID); 
    390392} 
    391393 
     
    395397                avcodec_close(avContext); 
    396398                avCodec = NULL; 
     399        } 
     400        if (parser) { 
     401                av_parser_close(parser); 
     402                parser = NULL; 
    397403        } 
    398404} 
     
    612618        // loop until we satisfy the request or run out of input data 
    613619        while (written < ioOutputDataByteSize && inputBuffer.GetNumPackets() > 0) { 
    614                 int packetSize = inputBuffer.GetCurrentPacketSize(); 
     620                int packetSize; 
     621                if(parser) 
     622                        packetSize = inputBuffer.GetDataAvailable(); 
     623                else 
     624                        packetSize = inputBuffer.GetCurrentPacketSize(); 
    615625                uint8_t *packet = inputBuffer.GetData(); 
    616626                 
    617627                // decode one packet to our buffer 
    618628                outBufUsed = outBufSize; 
     629                if(parser) 
     630                {        
     631                        int parserLen = av_parser_parse2(parser, avContext, &packet, &packetSize, packet, packetSize, 0, 0, 0); 
     632                        inputBuffer.Zap(parserLen); 
     633                } 
    619634                int len; 
    620635                if(dtsPassthrough) 
     
    631646                if (len < 0) { 
    632647                        Codecprintf(NULL, "Error decoding audio frame\n"); 
    633                         inputBuffer.Zap(packetSize); 
     648                        if(!parser) 
     649                                inputBuffer.Zap(packetSize); 
    634650                        outBufUsed = 0; 
    635651                        ioOutputDataByteSize = written; 
     
    637653                        return kAudioCodecProduceOutputPacketFailure; 
    638654                } 
    639                 inputBuffer.Zap(len); 
     655                if(!parser) 
     656                        inputBuffer.Zap(len); 
    640657                 
    641658                // copy up to the amount requested 
  • trunk/FFissionCodec/FFissionDecoder.h

    r1144 r1256  
    6363        bool dtsPassthrough; 
    6464        int fullChannelMap[6]; 
     65        AVCodecParserContext *parser; 
    6566}; 
    6667 
  • trunk/ff_MovieImport.c

    r1242 r1256  
    119119                REGISTER_DEMUXER(tta); 
    120120                REGISTER_DEMUXER(nuv); 
    121                 register_parsers(); 
     121                REGISTER_PARSER(ac3); 
     122                REGISTER_PARSER(mpegaudio); 
    122123                 
    123124                REGISTER_DECODER(msmpeg4v1); 
  • trunk/ff_private.c

    r1246 r1256  
    10141014         
    10151015        // record stream durations before we add any samples so that we know what to tell InsertMediaIntoTrack later 
     1016        // also, tell ffmpeg that we don't want them parsing because their parsers screw up the position/size data!!! 
    10161017        for(i = 0; i < storage->map_count; i++) { 
    10171018                ncstream = &storage->stream_map[i]; 
     
    10201021                if(media && ncstream->duration == -1) 
    10211022                        ncstream->duration = GetMediaDuration(media); 
     1023                ncstream->str->need_parsing = AVSTREAM_PARSE_NONE; 
    10221024        } 
    10231025