1 /* 2 * Copyright 2008-2010 Stephan Aßmus <superstippi@gmx.de> 3 * All rights reserved. Distributed under the terms of the MIT licensce. 4 */ 5 6 7 #include "ProxyVideoSupplier.h" 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 13 #include <Autolock.h> 14 15 #include "VideoTrackSupplier.h" 16 17 18 ProxyVideoSupplier::ProxyVideoSupplier() 19 : 20 fSupplierLock("video supplier lock"), 21 fSupplier(NULL) 22 { 23 } 24 25 26 ProxyVideoSupplier::~ProxyVideoSupplier() 27 { 28 } 29 30 31 const media_format& 32 ProxyVideoSupplier::Format() const 33 { 34 return fSupplier->Format(); 35 } 36 37 38 status_t 39 ProxyVideoSupplier::FillBuffer(int64 startFrame, void* buffer, 40 const media_raw_video_format& format, bool forceGeneration, 41 bool& wasCached) 42 { 43 bigtime_t now = system_time(); 44 45 BAutolock _(fSupplierLock); 46 //printf("ProxyVideoSupplier::FillBuffer(%lld)\n", startFrame); 47 if (fSupplier == NULL) 48 return B_NO_INIT; 49 50 if (fSupplier->CurrentFrame() == startFrame + 1) { 51 wasCached = true; 52 return B_OK; 53 } 54 55 wasCached = false; 56 status_t ret = B_OK; 57 bigtime_t performanceTime = 0; 58 if (fSupplier->CurrentFrame() != startFrame) { 59 int64 frame = startFrame; 60 ret = fSupplier->SeekToFrame(&frame); 61 if (ret != B_OK) 62 return ret; 63 // Read frames until we reach the frame before the one we want to read. 64 // But don't do it for more than 5 frames, or we will take too much 65 // time. Doing it this way will still catch up to the next keyframe 66 // eventually (we may return the wrong frames until the next keyframe). 67 if (!forceGeneration && startFrame - frame > 5) 68 return B_TIMED_OUT; 69 while (frame < startFrame) { 70 ret = fSupplier->ReadFrame(buffer, &performanceTime, format, 71 wasCached); 72 if (ret != B_OK) 73 return ret; 74 frame++; 75 } 76 } 77 78 ret = fSupplier->ReadFrame(buffer, &performanceTime, format, wasCached); 79 80 fProcessingLatency = system_time() - now; 81 82 return ret; 83 } 84 85 86 void 87 ProxyVideoSupplier::DeleteCaches() 88 { 89 } 90 91 92 void 93 ProxyVideoSupplier::SetSupplier(VideoTrackSupplier* supplier) 94 { 95 BAutolock _(fSupplierLock); 96 97 fSupplier = supplier; 98 } 99 100