Changeset 1086

Show
Ignore:
Timestamp:
06/25/09 01:41:15 (9 months ago)
Author:
astrange
Message:

Memory leaks found by valgrind:
- SubRenderer? was recreated and leaked on every Preflight call
(since multiple preflights can happen to the same component)
- AVCodecParser was never closed by FFusion
- CXXSubSerializer could never free itself
- an AVCodecContext could leak if the parser couldn't open

Found by GCC warnings:
- Many harmless(?) missing function prototypes
- "storage->movieLoadState ==" should be =

- Reroll an uselessly unrolled loop
- Rename freeFFusionParser to match the other function style
(this doesn't even begin to clean anything up)

Files:

Legend:

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

    r1069 r1086  
    3232#include <QuickTime/QuickTime.h> 
    3333#include <Accelerate/Accelerate.h> 
     34#include <sys/sysctl.h> 
    3435 
    3536#include "FFusionCodec.h" 
     
    414415                if (glob->begin.parser) 
    415416                { 
    416                         freeFFusionParser(glob->begin.parser); 
     417                        ffusionParserFree(glob->begin.parser); 
    417418                } 
    418419                 
  • trunk/FrameBuffer.h

    r1074 r1086  
    103103void FFusionDataSetUnparsed(FFusionData *data, uint8_t *buffer, int bufferSize); 
    104104 
     105void FFusionDataReadUnparsed(FFusionData *data); 
    105106 
    106107/*! 
  • trunk/Subtitles/SubATSUIRenderer.m

    r1048 r1086  
    253253                 
    254254                UCCreateTextBreakLocator(NULL, 0, kUCTextBreakLineMask, &breakLocator); 
    255                 [[SubContext alloc] initWithNonSSAType:kSubTypeSRT delegate:self]; 
     255                context = [[SubContext alloc] initWithNonSSAType:kSubTypeSRT delegate:self]; 
    256256        } 
    257257         
     
    277277                 
    278278                UCCreateTextBreakLocator(NULL, 0, kUCTextBreakLineMask, &breakLocator); 
    279                 [[SubContext alloc] initWithHeaders:headers styles:styles delegate:self]; 
     279                context = [[SubContext alloc] initWithHeaders:headers styles:styles delegate:self]; 
    280280        } 
    281281         
     
    303303-(void)completedHeaderParsing:(SubContext*)sc 
    304304{ 
    305         context = sc; 
    306         screenScaleX = videoWidth / context->resX; 
    307         screenScaleY = videoHeight / context->resY; 
     305        screenScaleX = videoWidth / sc->resX; 
     306        screenScaleY = videoHeight / sc->resY; 
    308307} 
    309308 
     
    11861185void SubPrerollFromHeader(char *header, int headerLen) 
    11871186{ 
    1188         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    11891187        SubtitleRendererPtr s = headerLen ? SubInitForSSA(header, headerLen, 640, 480) 
    11901188                                                                      : SubInitNonSSA(640, 480); 
     
    12131211         
    12141212        SubDisposeRenderer(s); 
    1215         [pool release]; 
    12161213} 
    12171214 
  • trunk/Subtitles/SubContext.m

    r1044 r1086  
    268268                 
    269269        } 
    270          
     270 
    271271        return self; 
    272272} 
     
    285285                defaultStyle = [[SubStyle defaultStyleWithDelegate:delegate] retain];            
    286286        } 
    287          
     287 
    288288        return self; 
    289289} 
  • trunk/Subtitles/SubImport.h

    r1044 r1086  
    110110{ 
    111111        __strong void *priv; 
     112        int retainCount; 
    112113         
    113114public: 
  • trunk/Subtitles/SubImport.mm

    r1046 r1086  
    14331433        priv = [[SubSerializer alloc] init]; 
    14341434    CFRetain(priv); 
     1435        retainCount = 1; 
    14351436} 
    14361437 
     
    14721473 
    14731474void CXXSubSerializer::release() 
    1474 
    1475         SubSerializer *s = (SubSerializer*)priv; 
    1476         int r = [s retainCount]; 
    1477          
    1478         if (r == 1) delete this; 
    1479         else [s release]; 
     1475{        
     1476        retainCount--; 
     1477         
     1478        if (!retainCount) 
     1479                delete this; 
    14801480} 
    14811481 
    14821482void CXXSubSerializer::retain() 
    14831483{ 
    1484         [(SubSerializer*)priv retain]
     1484        retainCount++
    14851485} 
    14861486 
  • trunk/TextSubCodec.c

    r1038 r1086  
    117117        glob->ssa = NULL; 
    118118        glob->colorSpace = NULL; 
     119        glob->translateSRT = true; 
    119120         
    120121        // Open and target an instance of the base decompressor as we delegate 
     
    248249         
    249250        capabilities->flags |= codecCanAsync | codecCanAsyncWhen | codecCanScale; 
    250         capabilities->flags2 |= codecDrawsHigherQualityScaled; 
    251      
    252         glob->colorSpace = NULL; 
    253         glob->translateSRT = true; 
    254         glob->ssa = NULL; 
     251        capabilities->flags2 |= codecDrawsHigherQualityScaled;     
    255252         
    256253        if (!glob->ssa) { 
  • trunk/VobSubCodec.c

    r1056 r1086  
    2424#include "VobSubCodec.h" 
    2525#include "Codecprintf.h" 
     26#include "CommonUtils.h" 
    2627#include <zlib.h> 
    2728#include "avcodec.h" 
     
    8586static ComponentResult ReadPacketControls(UInt8 *packet, UInt32 palette[16], PacketControlData *controlDataOut); 
    8687extern void initLib(); 
     88extern void init_FFmpeg(); 
    8789 
    8890ComponentResult VobSubCodecOpen(VobSubCodecGlobals glob, ComponentInstance self) 
  • trunk/bitstream_info.c

    r1038 r1086  
    3636#include "parser.h" 
    3737#include "golomb.h" 
     38#include "mpeg4video_parser.h" 
     39#include "Codecprintf.h" 
    3840 
    3941#include "CodecIDs.h" 
     
    868870} 
    869871 
    870 void freeFFusionParser(FFusionParserContext *parser) 
    871 
     872void ffusionParserFree(FFusionParserContext *parser) 
     873
     874        AVCodecParser *avparse = parser->parserStructure->avparse; 
     875         
    872876        if(parser->pc) 
    873877        { 
    874                 if(parser->pc->priv_data) 
    875                         av_free(parser->pc->priv_data); 
     878                if (avparse->parser_close) 
     879                        avparse->parser_close(parser->pc); 
     880                av_free(parser->pc->priv_data); 
    876881                av_free(parser->pc); 
    877882        } 
    878         if(parser->avctx) 
    879                 av_free(parser->avctx); 
    880         if(parser->internalContext) 
    881                 av_free(parser->internalContext); 
     883        av_free(parser->avctx); 
     884        av_free(parser->internalContext); 
    882885        free(parser); 
    883886} 
     
    888891    AVCodecParser *parser; 
    889892        FFusionParser *ffParser; 
    890     int ret; 
    891         struct AVCodecContext *ctx = avcodec_alloc_context(); 
     893    int ret, i; 
    892894         
    893895    if(codec_id == CODEC_ID_NONE) 
     
    898900    for(ffParser = ffusionFirstParser; ffParser != NULL; ffParser = ffParser->next) { 
    899901                parser = ffParser->avparse; 
    900         if (parser->codec_ids[0] == codec_id || 
    901             parser->codec_ids[1] == codec_id || 
    902             parser->codec_ids[2] == codec_id || 
    903             parser->codec_ids[3] == codec_id || 
    904             parser->codec_ids[4] == codec_id) 
    905             goto found; 
     902                 
     903                for (i = 0; i < 5; i++) 
     904                        if (parser->codec_ids[i] == codec_id) 
     905                                goto found; 
    906906    } 
    907907    return NULL; 
     
    928928         
    929929        FFusionParserContext *parserContext = malloc(sizeof(FFusionParserContext)); 
    930         parserContext->avctx = ctx
     930        parserContext->avctx = avcodec_alloc_context()
    931931        parserContext->pc = s; 
    932932        parserContext->parserStructure = ffParser; 
  • trunk/bitstream_info.h

    r1038 r1086  
    5959void initFFusionParsers(); 
    6060FFusionParserContext *ffusionParserInit(int codec_id); 
     61void ffusionParserFree(FFusionParserContext *parser); 
    6162int ffusionParseExtraData(FFusionParserContext *parser, const uint8_t *buf, int buf_size); 
    6263int ffusionParse(FFusionParserContext *parser, const uint8_t *buf, int buf_size, int *out_buf_size, int *type, int *skippable); 
  • trunk/ff_MovieImport.c

    r1083 r1086  
    556556bail: 
    557557        if(result == noErr) 
    558                 storage->movieLoadState == kMovieLoadStateLoaded; 
     558                storage->movieLoadState = kMovieLoadStateLoaded; 
    559559        else 
    560                 storage->movieLoadState == kMovieLoadStateError; 
     560                storage->movieLoadState = kMovieLoadStateError; 
    561561                 
    562562        if (result == -1)