|
Ah, so that's how it's done. Thanks.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Does GetCursorPos() help?
|
|
|
|
|
Yes, that's very helpful. I'll remember that for next time.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
SandipG wrote: Does GetCursorPos() help?
I ended up using the function you suggested. Thanks again.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Hello. I can not seem to understand how to show 640 x 480 RGB data onto a dialog as a single picture. Following code uses SetPixel() to show it but looks like it makes and show two pictures of 320 x 240.
void CShowPicDlg::OnShowClick()
{
CDC* pDC = this->GetDC();
DWORD dwStartIndexRGB = 1, dwMiddleIndexRGB = 2, dwEndIndexRGB = 3;
for (int y = 0; y < 480; y++) {
for (int x = 0; x < 640; x++) {
POINT wndPoint;
wndPoint.x = x;
wndPoint.y = y;
BYTE r = m_pFrameData[dwStartIndexRGB];
BYTE g = m_pFrameData[dwMiddleIndexRGB];
BYTE b = m_pFrameData[dwEndIndexRGB];
pDC->SetPixel(wndPoint, RGB(r, g, b));
dwStartIndexRGB += 4;
dwMiddleIndexRGB = dwStartIndexRGB + 1;
dwEndIndexRGB = dwStartIndexRGB + 2;
if(dwStartIndexRGB >= m_nSize)
break;
}
}
}
So
1 - why is it showing two similar pictures of smaller frame size while the data itself is a single picture with frame size 640 x 480 ?
2 - how do I set alpha value for getting original colors?
Thanks for any pointer.
modified 1-Jan-14 23:34pm.
|
|
|
|
|
What is the value of m_nSize ?
if(dwStartIndexRGB >= m_nSize)
break;
Veni, vidi, abiit domum
|
|
|
|
|
It is size of the data. I am storing this data and its size using constructor. The size of the data is 614400 . As said earlier, frame size is 640 x 480 and video format is RGB32.
|
|
|
|
|
640 * 480 * 4 bytes/pixel = 1,228,800 bytes. A size of 614,400 indicates that you may have smaller images or less colors.
You should also consider to use one of the bit blitter functions to show the images. They are much faster than drawing them pixel by pixel.
|
|
|
|
|
I am using IMFSourceReader interface to get frames from my HD cam. After configuring this interface when I call IMFSourceReader::ReadSample() function, I am given IMFSample pointer. Now this IMFSample contains the video data and its size. And the size is 614400.
I must point out that using the same configurations, I am writing the same data in a .wmv file using IMFSinkWriter . So how is it possible that .wmv file has the frame size 640 x 480 and then the same data, when drawing pixel by pixel, gets smaller?
I am stuck in it for the last two weeks. Still not idea how to display a frame on dialog, this way.
|
|
|
|
|
You must find out how the pixels are organized when you get the frames. With videos, frames may be present as progessive or interlaced frames. I guess you have interlaced frames (each frame contains only half of the picture). Then you must combine two frames to a full picture (get first scan line from frame 1, second line from frame 2, third line from frame 1, and so on).
|
|
|
|
|
I have checked this too, and came to know that frames are progressive. Everything is sett by default and I am setting only two properties i.e. Stream Type (video) and it's sub type (RGB32).
|
|
|
|
|
How did you checked that? When writing the frames using IMFSinkWriter , the stream is recoded when the input format does not match the output format. But you are trying to show a frame from the input stream. So you must know the format of the input stream (which may be also recoded by IMFSourceReader ). And the frame size indicates that it is interlaced or 320 * 480.
|
|
|
|
|
Jochen Arndt wrote: How did you checked that?
Let me write a small pseudo code for this operation, though the code is very long.
HRESULT hResult = OpenMediaSource();
hResult = EnumerateStream();
hResult = ConfigureDecoder();
hResult = SetDeviceFormat();
hResult = ConfigureEncoder();
Now I am setting frame size on IMFSourceReader in ConfigureDecoder() . Then I get IMFMediaType of IMFSourceReader in ConfigureEncoder() and set it using IMFSinkWriter::SetInputMediaType() . I also use IMFMediaType->GetUINT32(MFVideoInterlaceMode, ...) within ConfigureEncoder (among other things), which returns MFVideoInterlace_Progressive.
In short, IMFSinkWriter has the same type as the IMFSourceReader . Here is how I capture the video and save it in a .bin file
IMFSample* pSample = NULL;
IMFMediaBuffer* pBuffer = NULL;
HRESULT hResult = pReader->ReadSample();
hResult = pReader->ReadSample();
while(nTotalSamples <= 360)
{
pSample->SetSampleTime(llTimeStamp);
pWriter->WriteSample(0, pSample);
pSample->GetBufferByIndex(0, &pBuffer);
pBuffer->GetCurrentLength(&dwLength);
pBuffer->Lock(&pData, NULL, &dwSize);
pBuffer->Unlock();
pReader->ReadSample();
nTotalSamples++;
}
Hopefully I was able to make it clear.
|
|
|
|
|
|
Yes. I get this kind of information in a separate function which gets called in ConfigureEncoder() . As I said, IMFMediaType is same for both encoder and the decoder.
Since I am a newbie with this, can you explain what does it mean when the size is 1228800 (640x480x4) and 614400.
However, after all the mess that I created , I must inform that I was able to run the program with expected results. You were right. 614400 size meant that the frame size was smaller (as said earlier, I don't know why). I tried frame size 320 x 480 (320x480x4) and it worked. Perhaps I will try to scale the picture for better viewing. I thank you, once again, for your constant support.
modified 1-Jan-14 23:40pm.
|
|
|
|
|
Hi,
My dialog is calling a child CFileDialog(). I killed app using Task Manager but common dialog still alive and appear as a separate process in Task Manager.
Please suggest ... how to close this?
|
|
|
|
|
We cannot tell what is happening unless you show the code where you start the orphan dialog.
Veni, vidi, abiit domum
|
|
|
|
|
Record.h
=========
#include <string>
using namespace std;
class Record
{
public:
void setPersonName(string);
string getPersonName();
void setEmail(string);
string getEmail();
void setTelephoneNumber(int);
int getTelephoneNumber();
private:
string personName;
string email;
int telephoneNumber;
}
-----------------------------------
Record.cpp
===========
#include <iostream>
#include <string>
using namespace std;
#include "Record.h"
void Record::setPersonName(string name)
{
personName=name;
}
string Record::getPersonName()
{
return personName;
}
void Record::setEmail(string mail)
{
mail=email;
}
string Record::getEmail()
{
return email;
}
void Record::setTelephoneNumber(int number)
{
number=telephoneNumber;
}
int Record::getTelephoneNumber()
{
return telephoneNumber;
}
---------
1> Record.cpp
1>c:\users\hoyin\documents\visual studio 2010\projects\record\record\record.cpp(7): error C2628:
1>c:\users\hoyin\documents\visual studio 2010\projects\record\record\record.cpp(8): error C2556:
1> c:\users\hoyin\documents\visual studio 2010\projects\record\record\record.h(7) : see declaration of
1>c:\users\hoyin\documents\visual studio 2010\projects\record\record\record.cpp(8): error C2371:
1> c:\users\hoyin\documents\visual studio 2010\projects\record\record\record.h(7) : see declaration of
1>
1>Build FAILED.
1>
|
|
|
|
|
you should add on .h file : "use std::string " or
class Record
{
public:
void setPersonName(string);
std::string getPersonName();
void setEmail(string);
std::string getEmail();
void setTelephoneNumber(int);
int getTelephoneNumber();
private:
std::string personName;
std::string email;
int telephoneNumber;
}
|
|
|
|
|
The end of your class definition needs a ;
class Record
{
};
|
|
|
|
|
I bought a fingerprint machine called ZKFinger 4500. The SDK provided is a raw code of Visual C++. I have been trying to converting this project into dll file and even if it cant be, how do i make use of it in my VB.Net Project?
|
|
|
|
|
|
Hi,
I'm have been trying to write an code in C++ by using the Win32 API to communicate through the RS232 serial port with equipment. It's a simplex communication (only the equipment sends data in blocks of 289 bytes). I'm using an dedicated thread to read the serial port. Firstly I tried to use non-overlapped communication, but I realized that is impossible to close the serial port if there's no data incoming (the thread gets stuck on WaitCommEvent function). So I tried to use overlapped I/O and WaitForMultipleObjects to solve this problem:
void *SerialRead(void *param) {
OVERLAPPED overlapped;
memset( &overlapped, 0, sizeof(overlapped) );
overlapped.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
SerialEvents[0] = overlapped.hEvent;
ReadFile(SerialPort, SerialBuffer, 289, &dwBytesRead, &overlapped);
while (WaitForMultipleObjects(2, SerialEvents, false, INFINITE) == WAIT_OBJECT_0) {
ReadFile(SerialPort, SerialBuffer, 289, &dwBytesRead, &overlapped); }
ClosePort();
return 0;
}
I use the function SetEvent(SerialEvents[1]); to close serial port on the main thread.
To open the serial port:
SerialPort = CreateFile(PortName,
GENERIC_READ|GENERIC_WRITE,0, 0, OPEN_EXISTING,FILE_FLAG_OVERLAPPED, 0);
The problem is that even if I recive the 289 bytes, the thread keeps wating the function "WaitForMultipleObjects" return. If I recive the next 289 bytes the WaitForMultipleObjects function returns, but the data are mixed.
Someone could help me?
|
|
|
|
|
You have created 1 event but your call to WaitForMultipleObjects [^] says that there are 2 events. You also make no attempt to check the return value from WaitForMultipleObjects so you do not really know what is happening.
Veni, vidi, abiit domum
|
|
|
|
|
I forgot to mention that I created the other envent (SerialEvents[1]) on the main thread:
SerialEvents[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
This event is used to close the serial port (signaled by the main thread when user press the close button) and it is working!.
I used the GetLastError() function after WaitForMultipleObjects(), and it returns "ERROR_IO_PENDING". What could it be? I'm sure that the equipment is sending all 289 bytes!
|
|
|
|