Changeset 956
- Timestamp:
- 10/04/08 20:19:22 (2 months ago)
- Files:
-
- branches/perian-1.1/FFusionCodec.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/perian-1.1/FFusionCodec.c
r954 r956 60 60 { 61 61 AVFrame *frame; 62 short used; 62 short retainCount; 63 short ffmpegUsing; 63 64 long frameNumber; 64 65 AVFrame returnedFrame; … … 154 155 static void FFusionReleaseBuffer(AVCodecContext *s, AVFrame *pic); 155 156 static void releaseBuffer(AVCodecContext *s, FFusionBuffer *buf); 156 static FFusionBuffer *retainBuffer(FFusion Buffer *buf);157 static FFusionBuffer *retainBuffer(FFusionGlobals glob, FFusionBuffer *buf); 157 158 static void SetupMultithreadedDecoding(AVCodecContext *s, enum CodecID codecID); 158 159 … … 971 972 myDrp->frameNumber = p->frameNumber; 972 973 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]); 975 976 break; 976 977 } … … 1181 1182 if(myDrp->frameData && myDrp->frameData->decoded && glob->decode.futureBuffer != NULL) 1182 1183 { 1183 myDrp->buffer = retainBuffer(glob ->decode.futureBuffer);1184 myDrp->buffer = retainBuffer(glob, glob->decode.futureBuffer); 1184 1185 myDrp->decoded = true; 1185 1186 #if 0 /* Need to make sure this frame's data is not eradicated during the decompress */ … … 1237 1238 1238 1239 if (glob->packedType == PACKED_QUICKTIME_KNOWS_ORDER) { 1239 myDrp->buffer = retainBuffer(&glob->buffers[glob->lastAllocatedBuffer]);1240 myDrp->buffer = &glob->buffers[glob->lastAllocatedBuffer]; 1240 1241 myDrp->buffer->frameNumber = myDrp->frameNumber; 1242 retainBuffer(glob, myDrp->buffer); 1241 1243 myDrp->buffer->returnedFrame = tempFrame; 1242 1244 myDrp->decoded = true; … … 1246 1248 myDrp->buffer = NULL; 1247 1249 else 1248 myDrp->buffer = retainBuffer( (FFusionBuffer *)tempFrame.opaque);1250 myDrp->buffer = retainBuffer(glob, (FFusionBuffer *)tempFrame.opaque); 1249 1251 1250 1252 if(tempFrame.pict_type == FF_I_TYPE) … … 1300 1302 1301 1303 if (myDrp->buffer) 1304 { 1302 1305 picture = myDrp->buffer->frame; 1306 FFusionDebugPrint("%p DrawBand #%d. found %d\n", glob, myDrp->frameNumber, myDrp->buffer->frameNumber); 1307 } 1303 1308 else 1304 1309 picture = &glob->lastDisplayedFrame; … … 1674 1679 if (ret >= 0) { 1675 1680 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]); 1677 1683 pic->opaque = &glob->buffers[i]; 1678 1684 glob->buffers[i].frame = pic; 1679 glob->buffers[i].used = 1; 1685 glob->buffers[i].retainCount = 1; 1686 glob->buffers[i].ffmpegUsing = 1; 1680 1687 glob->lastAllocatedBuffer = i; 1681 1688 break; … … 1692 1699 FFusionBuffer *buf = pic->opaque; 1693 1700 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 1708 static 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); 1700 1712 return buf; 1701 1713 } … … 1703 1715 static void releaseBuffer(AVCodecContext *s, FFusionBuffer *buf) 1704 1716 { 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) 1707 1721 { 1708 1722 buf->returnedFrame.data[0] = NULL;
