diff --git a/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.cpp b/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.cpp index 8b937a16de..422cadfee0 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.cpp +++ b/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.cpp @@ -108,7 +108,7 @@ CamDeframer::GetFrame(CamFrame **frame, bigtime_t *stamp) if (!f) return ENOENT; *frame = f; - *stamp = 0LL; + *stamp = f->Stamp(); return B_OK; } diff --git a/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.h b/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.h index 7c160d058c..05f3070c15 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.h +++ b/src/add-ons/media/media-add-ons/usb_webcam/CamDeframer.h @@ -18,7 +18,14 @@ ST_FRAME /* should have a real Frame class someday */ -#define CamFrame BMallocIO +class CamFrame : public BMallocIO +{ +public: + CamFrame() : BMallocIO() { fStamp = system_time(); }; +virtual ~CamFrame() {}; +bigtime_t Stamp() const { return fStamp; }; +bigtime_t fStamp; +}; class CamDeframer : public CamFilterInterface { diff --git a/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.cpp b/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.cpp index a85604d4c5..0c73216ab1 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.cpp +++ b/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.cpp @@ -242,14 +242,14 @@ CamDevice::WaitFrame(bigtime_t timeout) // ----------------------------------------------------------------------------- status_t -CamDevice::GetFrameBitmap(BBitmap **bm) +CamDevice::GetFrameBitmap(BBitmap **bm, bigtime_t *stamp) { return EINVAL; } // ----------------------------------------------------------------------------- status_t -CamDevice::FillFrameBuffer(BBuffer *buffer) +CamDevice::FillFrameBuffer(BBuffer *buffer, bigtime_t *stamp) { return EINVAL; } diff --git a/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.h b/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.h index f4a88b8751..1bab2b8861 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.h +++ b/src/add-ons/media/media-add-ons/usb_webcam/CamDevice.h @@ -66,8 +66,8 @@ class CamDevice { // several ways to get raw frames virtual status_t WaitFrame(bigtime_t timeout); - virtual status_t GetFrameBitmap(BBitmap **bm); - virtual status_t FillFrameBuffer(BBuffer *buffer); + virtual status_t GetFrameBitmap(BBitmap **bm, bigtime_t *stamp=NULL); + virtual status_t FillFrameBuffer(BBuffer *buffer, bigtime_t *stamp=NULL); // locking bool Lock(); diff --git a/src/add-ons/media/media-add-ons/usb_webcam/Producer.cpp b/src/add-ons/media/media-add-ons/usb_webcam/Producer.cpp index 49aba4f24b..7079e413f0 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/Producer.cpp +++ b/src/add-ons/media/media-add-ons/usb_webcam/Producer.cpp @@ -744,10 +744,12 @@ VideoProducer::FrameGenerator() /* For a buffer originating from a device, you might want to calculate * this based on the PerformanceTimeFor the time your buffer arrived at * the hardware (plus any applicable adjustments). */ + /* h->start_time = fPerformanceTimeBase + (bigtime_t) ((fFrame - fFrameBase) * (1000000 / fConnectedFormat.field_rate)); + */ h->file_pos = 0; h->orig_size = 0; h->data_offset = 0; @@ -771,19 +773,24 @@ VideoProducer::FrameGenerator() //NO! must be called without lock! //BAutolock lock(fCamDevice->Locker()); + bigtime_t stamp; //#ifdef UseFillFrameBuffer - err = fCamDevice->FillFrameBuffer(buffer); + err = fCamDevice->FillFrameBuffer(buffer, &stamp); if (err < B_OK) { ;//XXX handle error } //#endif #ifdef UseGetFrameBitmap BBitmap *bm; - err = fCamDevice->GetFrameBitmap(&bm); + err = fCamDevice->GetFrameBitmap(&bm, &stamp); if (err >= B_OK) { ;//XXX handle error } #endif + //PRINTF(1, ("FrameGenerator: stamp %Ld vs %Ld\n", stamp, h->start_time)); + //XXX: that's what we should be doing, but CodyCam drops all frames as they are late. (maybe add latency ??) + //h->start_time = TimeSource()->PerformanceTimeFor(stamp); + h->start_time = TimeSource()->PerformanceTimeFor(system_time()); PRINTF(1, ("FrameGenerator: SendBuffer...\n")); /* Send the buffer on down to the consumer */ diff --git a/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.cpp b/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.cpp index 3d4242cf8f..6d2ff9105a 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.cpp +++ b/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.cpp @@ -415,18 +415,17 @@ SonixCamDevice::ValidateEndOfFrameTag(const uint8 *tag, size_t taglen, size_t da // ----------------------------------------------------------------------------- status_t -SonixCamDevice::GetFrameBitmap(BBitmap **bm) +SonixCamDevice::GetFrameBitmap(BBitmap **bm, bigtime_t *stamp=NULL) { BBitmap *b; CamFrame *f; - bigtime_t stamp; status_t err; PRINT((CH "()" CT)); err = fDeframer->WaitFrame(200000); if (err < B_OK) { PRINT((CH ": WaitFrame: %s" CT, strerror(err))); } if (err < B_OK) return err; - err = fDeframer->GetFrame(&f, &stamp); + err = fDeframer->GetFrame(&f, stamp); if (err < B_OK) { PRINT((CH ": GetFrame: %s" CT, strerror(err))); } if (err < B_OK) return err; @@ -446,10 +445,9 @@ SonixCamDevice::GetFrameBitmap(BBitmap **bm) // ----------------------------------------------------------------------------- status_t -SonixCamDevice::FillFrameBuffer(BBuffer *buffer) +SonixCamDevice::FillFrameBuffer(BBuffer *buffer, bigtime_t *stamp) { CamFrame *f; - bigtime_t stamp; status_t err; PRINT((CH "()" CT)); @@ -459,7 +457,7 @@ SonixCamDevice::FillFrameBuffer(BBuffer *buffer) if (err < B_OK) return err; - err = fDeframer->GetFrame(&f, &stamp); + err = fDeframer->GetFrame(&f, stamp); if (err < B_OK) { PRINT((CH ": GetFrame: %s" CT, strerror(err))); } if (err < B_OK) return err; diff --git a/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.h b/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.h index fe26b6309a..e4360da86e 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.h +++ b/src/add-ons/media/media-add-ons/usb_webcam/addons/sonix/SonixCamDevice.h @@ -68,8 +68,8 @@ class SonixCamDevice : public CamDevice virtual bool ValidateStartOfFrameTag(const uint8 *tag, size_t taglen); virtual bool ValidateEndOfFrameTag(const uint8 *tag, size_t taglen, size_t datalen); - virtual status_t GetFrameBitmap(BBitmap **bm); - virtual status_t FillFrameBuffer(BBuffer *buffer); + virtual status_t GetFrameBitmap(BBitmap **bm, bigtime_t *stamp=NULL); + virtual status_t FillFrameBuffer(BBuffer *buffer, bigtime_t *stamp=NULL); void DumpRegs();