Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
SampleGrabberCallback.cpp
1 #include "SampleGrabberCallback.hh"
2 #include <iostream>
3 //#include <Base/Helper.hh>
4 #include <Base/Debug/Debug.hh>
5 
6 using namespace BIAS;
7 using namespace std;
8 
11 {
12  TargetBuffer_ = NULL;
13  Width_ = 640;
14  Height_ = 480;
15  CallbackFunction_ = NULL;
16 }
17 
18 
21 {}
22 
23 
24 #ifdef BIAS_HAVE_DSHOW
25 STDMETHODIMP SampleGrabberCallback::
26 BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen)
27 {
28 //ISampleGrabberCB::BufferCB gets a pointer to a copy of the data in the media sample.
29  //unsigned char *pImageData = camera_.GetImageData();
30  //BIASASSERT(BufferLen==camera_.GetSizeByte());
31  //memcpy(pImageData,pBuffer,BufferLen);
32  // return S_OK; //nix da !
33  return E_NOTIMPL;
34 }
35 
36 
37 STDMETHODIMP SampleGrabberCallback::
38 SampleCB(double SampleTime, IMediaSample *pSample)
39 {
40  //cout <<"SampleGrabberCallback::SampleCB("<<SampleTime<<")"<<endl;
41  /*HRESULT res;
42  REFERENCE_TIME rs, re;
43  res = pSample->GetTime(&rs, &re);
44  if (res==S_OK){
45  cout << "GetTime("<<rs<<", "<<re<<")\n";
46  }
47  LONGLONG ms, me;
48  res = pSample->GetMediaTime(&ms, &me);
49  if (res==S_OK){
50  cout << "GetMediaTime("<<rs<<", "<<re<<")\n";
51  }*/
52  if(SampleTrigger_ || !TargetBuffer_){return S_OK;}
53 
54  unsigned char *TargetBuffer = TargetBuffer_;
55  unsigned int TargetSize = TargetSize_;
56 
57  BYTE *pSampleData;
58  pSample->GetPointer(&pSampleData);
59  unsigned bytesperline = Width_ * 3;
60  BYTE *pSampleDataLine = pSampleData;
61  BYTE *pFlipTarget = TargetBuffer + (Height_-1)* bytesperline;
62  unsigned bytewidth = Width_*3;
63  //flip and swap rgb
64  for(unsigned y=0; y<Height_; y++)
65  {
66  for(unsigned x=0; x<bytewidth; x+=3)
67  {
68  *(pFlipTarget+x) = pSampleDataLine[x+2];
69  *(pFlipTarget+x+1) = pSampleDataLine[x+1];
70  *(pFlipTarget+x+2) = pSampleDataLine[x];
71  }
72  pSampleDataLine+=bytesperline;
73  pFlipTarget -=bytesperline;
74  }
75 
76  SampleTrigger_ = true;
77  if (CallbackFunction_){
78  (*CallbackFunction_)(SampleTime);
79  }
80  return S_OK;
81 }
82 
83 /****************************************************************/
84 
85 STDMETHODIMP SampleGrabberCallback::
86 QueryInterface(REFIID riid, void ** ppv) {
87 
88  if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ) {
89  *ppv = (void *) static_cast<ISampleGrabberCB*> ( this );
90  return NOERROR;
91  }
92  return E_NOINTERFACE;
93 }
94 
95 #endif
96 
99 {
100  SampleTrigger_ = false;
101 }
102 
103 
106 {
107  while (!SampleTrigger_) {Sleep(200/1000);} /// TODO: Make it platform independent
108 }
109 
110 
113 {
114  return SampleTrigger_;
115 }
116 
117 
119 SetTargetBuffer(unsigned char *t, unsigned int s, unsigned w, unsigned h)
120 {
121  TargetBuffer_ = t;
122  TargetSize_ = s;
123  Width_ = w;
124  Height_ = h;
125 }
void SampleTriggerWait()
waits until one frame ist grabbed.
STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen)
bool SampleTriggered()
returns trigger state use this if you want to wait for the sample trigger on your own...
STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
void SampleTriggerArm()
resets internal trigger call this before grabbing a frame or the internal trigger can&#39;t signal that t...
void SetTargetBuffer(unsigned char *TargetBuffer, unsigned int size, unsigned width, unsigned height)
STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample)