Changeset 954

Show
Ignore:
Timestamp:
10/02/08 16:38:12 (2 months ago)
Author:
gbooker
Message:

Implemented a reference counting on frame buffers so that we are sure that decoded frames are not overwriten before QT is done with them

Files:

Legend:

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

    r953 r954  
    6060{ 
    6161        AVFrame         *frame; 
    62         bool          used; 
     62        short         used; 
    6363        long            frameNumber; 
    6464        AVFrame         returnedFrame; 
     
    153153static int FFusionGetBuffer(AVCodecContext *s, AVFrame *pic); 
    154154static void FFusionReleaseBuffer(AVCodecContext *s, AVFrame *pic); 
     155static void releaseBuffer(AVCodecContext *s, FFusionBuffer *buf); 
     156static FFusionBuffer *retainBuffer(FFusionBuffer *buf); 
    155157static void SetupMultithreadedDecoding(AVCodecContext *s, enum CodecID codecID); 
    156158 
     
    970972                for (i = 0; i < FFUSION_MAX_BUFFERS; i++) { 
    971973                        if (glob->buffers[i].used && glob->buffers[i].frameNumber == myDrp->frameNumber) { 
    972                                 myDrp->buffer = &glob->buffers[i]
     974                                myDrp->buffer = retainBuffer(&glob->buffers[i])
    973975                                break; 
    974976                        } 
     
    11791181        if(myDrp->frameData && myDrp->frameData->decoded && glob->decode.futureBuffer != NULL) 
    11801182        { 
    1181                 myDrp->buffer = glob->decode.futureBuffer
     1183                myDrp->buffer = retainBuffer(glob->decode.futureBuffer)
    11821184                myDrp->decoded = true; 
    11831185#if 0   /* Need to make sure this frame's data is not eradicated during the decompress */ 
     
    12351237                 
    12361238        if (glob->packedType == PACKED_QUICKTIME_KNOWS_ORDER) { 
    1237                 myDrp->buffer = &glob->buffers[glob->lastAllocatedBuffer]
     1239                myDrp->buffer = retainBuffer(&glob->buffers[glob->lastAllocatedBuffer])
    12381240                myDrp->buffer->frameNumber = myDrp->frameNumber; 
    12391241                myDrp->buffer->returnedFrame = tempFrame; 
     
    12441246                myDrp->buffer = NULL; 
    12451247        else 
    1246                 myDrp->buffer = (FFusionBuffer *)tempFrame.opaque
     1248                myDrp->buffer = retainBuffer((FFusionBuffer *)tempFrame.opaque)
    12471249         
    12481250        if(tempFrame.pict_type == FF_I_TYPE) 
     
    13951397        FFusionDecompressRecord *myDrp = (FFusionDecompressRecord *)drp->userDecompressRecord; 
    13961398        glob->stats.type[drp->frameType].end_calls++; 
     1399        FFusionBuffer *buf = myDrp->buffer; 
     1400        if(buf) 
     1401                releaseBuffer(glob->avContext, buf); 
     1402         
    13971403        FFusionDebugPrint("%p EndBand #%d.\n", glob, myDrp->frameNumber); 
    13981404         
     
    16711677                                pic->opaque = &glob->buffers[i]; 
    16721678                                glob->buffers[i].frame = pic; 
    1673                                 glob->buffers[i].used = true
     1679                                glob->buffers[i].used = 1
    16741680                                glob->lastAllocatedBuffer = i; 
    16751681                                break; 
     
    16861692        FFusionBuffer *buf = pic->opaque; 
    16871693         
    1688         buf->used = false; 
    1689         buf->returnedFrame.data[0] = NULL; 
    1690          
    1691         avcodec_default_release_buffer(s, pic); 
     1694        releaseBuffer(s, buf); 
     1695
     1696 
     1697static FFusionBuffer *retainBuffer(FFusionBuffer *buf) 
     1698
     1699        buf->used++; 
     1700        return buf; 
     1701
     1702 
     1703static void releaseBuffer(AVCodecContext *s, FFusionBuffer *buf) 
     1704
     1705        buf->used--; 
     1706        if(!buf->used) 
     1707        { 
     1708                buf->returnedFrame.data[0] = NULL; 
     1709                avcodec_default_release_buffer(s, buf->frame); 
     1710        } 
    16921711} 
    16931712