Changeset 956

Show
Ignore:
Timestamp:
10/04/08 20:19:22 (2 months ago)
Author:
gbooker
Message:

Apparently, ffmpeg keeps trying to release the same picture over and over until it really is, so track ffmpeg's usage in a different variable.
Fixes #377

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/perian-1.1/FFusionCodec.c

    r954 r956  
    6060{ 
    6161        AVFrame         *frame; 
    62         short           used; 
     62        short           retainCount; 
     63        short           ffmpegUsing; 
    6364        long            frameNumber; 
    6465        AVFrame         returnedFrame; 
     
    154155static void FFusionReleaseBuffer(AVCodecContext *s, AVFrame *pic); 
    155156static void releaseBuffer(AVCodecContext *s, FFusionBuffer *buf); 
    156 static FFusionBuffer *retainBuffer(FFusionBuffer *buf); 
     157static FFusionBuffer *retainBuffer(FFusionGlobals glob, FFusionBuffer *buf); 
    157158static void SetupMultithreadedDecoding(AVCodecContext *s, enum CodecID codecID); 
    158159 
     
    971972                myDrp->frameNumber = p->frameNumber; 
    972973                for (i = 0; i < FFUSION_MAX_BUFFERS; i++) { 
    973                         if (glob->buffers[i].used && glob->buffers[i].frameNumber == myDrp->frameNumber) { 
    974                                 myDrp->buffer = retainBuffer(&glob->buffers[i]); 
     974                        if (glob->buffers[i].retainCount && glob->buffers[i].frameNumber == myDrp->frameNumber) { 
     975                                myDrp->buffer = retainBuffer(glob, &glob->buffers[i]); 
    975976                                break; 
    976977                        } 
     
    11811182        if(myDrp->frameData && myDrp->frameData->decoded && glob->decode.futureBuffer != NULL) 
    11821183        { 
    1183                 myDrp->buffer = retainBuffer(glob->decode.futureBuffer); 
     1184                myDrp->buffer = retainBuffer(glob, glob->decode.futureBuffer); 
    11841185                myDrp->decoded = true; 
    11851186#if 0   /* Need to make sure this frame's data is not eradicated during the decompress */ 
     
    12371238                 
    12381239        if (glob->packedType == PACKED_QUICKTIME_KNOWS_ORDER) { 
    1239                 myDrp->buffer = retainBuffer(&glob->buffers[glob->lastAllocatedBuffer])
     1240                myDrp->buffer = &glob->buffers[glob->lastAllocatedBuffer]
    12401241                myDrp->buffer->frameNumber = myDrp->frameNumber; 
     1242                retainBuffer(glob, myDrp->buffer); 
    12411243                myDrp->buffer->returnedFrame = tempFrame; 
    12421244                myDrp->decoded = true; 
     
    12461248                myDrp->buffer = NULL; 
    12471249        else 
    1248                 myDrp->buffer = retainBuffer((FFusionBuffer *)tempFrame.opaque); 
     1250                myDrp->buffer = retainBuffer(glob, (FFusionBuffer *)tempFrame.opaque); 
    12491251         
    12501252        if(tempFrame.pict_type == FF_I_TYPE) 
     
    13001302         
    13011303        if (myDrp->buffer) 
     1304        { 
    13021305                picture = myDrp->buffer->frame; 
     1306                FFusionDebugPrint("%p DrawBand #%d. found %d\n", glob, myDrp->frameNumber, myDrp->buffer->frameNumber); 
     1307        } 
    13031308        else 
    13041309                picture = &glob->lastDisplayedFrame; 
     
    16741679        if (ret >= 0) { 
    16751680                for (i = 0; i < FFUSION_MAX_BUFFERS; i++) { 
    1676                         if (!glob->buffers[i].used) { 
     1681                        if (!glob->buffers[i].retainCount) { 
     1682//                              FFusionDebugPrint("%p Starting Buffer %p.\n", glob, &glob->buffers[i]); 
    16771683                                pic->opaque = &glob->buffers[i]; 
    16781684                                glob->buffers[i].frame = pic; 
    1679                                 glob->buffers[i].used = 1; 
     1685                                glob->buffers[i].retainCount = 1; 
     1686                                glob->buffers[i].ffmpegUsing = 1; 
    16801687                                glob->lastAllocatedBuffer = i; 
    16811688                                break; 
     
    16921699        FFusionBuffer *buf = pic->opaque; 
    16931700         
    1694         releaseBuffer(s, buf); 
    1695 
    1696  
    1697 static FFusionBuffer *retainBuffer(FFusionBuffer *buf) 
    1698 
    1699         buf->used++; 
     1701        if(buf->ffmpegUsing) 
     1702        { 
     1703                buf->ffmpegUsing = 0; 
     1704                releaseBuffer(s, buf); 
     1705        } 
     1706
     1707 
     1708static FFusionBuffer *retainBuffer(FFusionGlobals glob, FFusionBuffer *buf) 
     1709
     1710        buf->retainCount++; 
     1711//      FFusionDebugPrint("%p Retained Buffer %p #%d to %d.\n", glob, buf, buf->frameNumber, buf->retainCount); 
    17001712        return buf; 
    17011713} 
     
    17031715static void releaseBuffer(AVCodecContext *s, FFusionBuffer *buf) 
    17041716{ 
    1705         buf->used--; 
    1706         if(!buf->used) 
     1717        buf->retainCount--; 
     1718//      FFusionGlobals glob = (FFusionGlobals)s->opaque; 
     1719//      FFusionDebugPrint("%p Released Buffer %p #%d to %d.\n", glob, buf, buf->frameNumber, buf->retainCount); 
     1720        if(!buf->retainCount) 
    17071721        { 
    17081722                buf->returnedFrame.data[0] = NULL;