Changeset 954
- Timestamp:
- 10/02/08 16:38:12 (2 months ago)
- Files:
-
- branches/perian-1.1/FFusionCodec.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/perian-1.1/FFusionCodec.c
r953 r954 60 60 { 61 61 AVFrame *frame; 62 boolused;62 short used; 63 63 long frameNumber; 64 64 AVFrame returnedFrame; … … 153 153 static int FFusionGetBuffer(AVCodecContext *s, AVFrame *pic); 154 154 static void FFusionReleaseBuffer(AVCodecContext *s, AVFrame *pic); 155 static void releaseBuffer(AVCodecContext *s, FFusionBuffer *buf); 156 static FFusionBuffer *retainBuffer(FFusionBuffer *buf); 155 157 static void SetupMultithreadedDecoding(AVCodecContext *s, enum CodecID codecID); 156 158 … … 970 972 for (i = 0; i < FFUSION_MAX_BUFFERS; i++) { 971 973 if (glob->buffers[i].used && glob->buffers[i].frameNumber == myDrp->frameNumber) { 972 myDrp->buffer = &glob->buffers[i];974 myDrp->buffer = retainBuffer(&glob->buffers[i]); 973 975 break; 974 976 } … … 1179 1181 if(myDrp->frameData && myDrp->frameData->decoded && glob->decode.futureBuffer != NULL) 1180 1182 { 1181 myDrp->buffer = glob->decode.futureBuffer;1183 myDrp->buffer = retainBuffer(glob->decode.futureBuffer); 1182 1184 myDrp->decoded = true; 1183 1185 #if 0 /* Need to make sure this frame's data is not eradicated during the decompress */ … … 1235 1237 1236 1238 if (glob->packedType == PACKED_QUICKTIME_KNOWS_ORDER) { 1237 myDrp->buffer = &glob->buffers[glob->lastAllocatedBuffer];1239 myDrp->buffer = retainBuffer(&glob->buffers[glob->lastAllocatedBuffer]); 1238 1240 myDrp->buffer->frameNumber = myDrp->frameNumber; 1239 1241 myDrp->buffer->returnedFrame = tempFrame; … … 1244 1246 myDrp->buffer = NULL; 1245 1247 else 1246 myDrp->buffer = (FFusionBuffer *)tempFrame.opaque;1248 myDrp->buffer = retainBuffer((FFusionBuffer *)tempFrame.opaque); 1247 1249 1248 1250 if(tempFrame.pict_type == FF_I_TYPE) … … 1395 1397 FFusionDecompressRecord *myDrp = (FFusionDecompressRecord *)drp->userDecompressRecord; 1396 1398 glob->stats.type[drp->frameType].end_calls++; 1399 FFusionBuffer *buf = myDrp->buffer; 1400 if(buf) 1401 releaseBuffer(glob->avContext, buf); 1402 1397 1403 FFusionDebugPrint("%p EndBand #%d.\n", glob, myDrp->frameNumber); 1398 1404 … … 1671 1677 pic->opaque = &glob->buffers[i]; 1672 1678 glob->buffers[i].frame = pic; 1673 glob->buffers[i].used = true;1679 glob->buffers[i].used = 1; 1674 1680 glob->lastAllocatedBuffer = i; 1675 1681 break; … … 1686 1692 FFusionBuffer *buf = pic->opaque; 1687 1693 1688 buf->used = false; 1689 buf->returnedFrame.data[0] = NULL; 1690 1691 avcodec_default_release_buffer(s, pic); 1694 releaseBuffer(s, buf); 1695 } 1696 1697 static FFusionBuffer *retainBuffer(FFusionBuffer *buf) 1698 { 1699 buf->used++; 1700 return buf; 1701 } 1702 1703 static 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 } 1692 1711 } 1693 1712
