|
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!
|
|
|
|
|
ERROR_IO_PENDING is a normal return value that indicates that the transfer is taking place in the background.
When you get that return value, you're supposed to wait on the event, then when the event is signaled, call GetOverlappedResult() .
Look up that function, and you'll see how it works.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Thanks for reply, I discovered the problem. It was that on setup when openning the serial port I was calling GetCommState() function before SetCommState(), so it was overwriting the DCB structure configuration, setting a wrong baud rate value. I fix it and now it's working wonderfully!
|
|
|
|
|
hi all,
why not initialize the array of variable length why there is always need to assign size first.
how can I do this
int buffer_length;
buffer_length=lenth of some string.
BYTE byte_buffer[buffer_length];
can anyody help me for this.
thanks.
|
|
|
|
|
Hi,
can anyody help me for this.
Check out the std::vector class.[^]
You can also create it on the heap:
PBYTE buf = new BYTE[buffer_length];
Best Wishes,
-David Delaune
|
|
|
|
|
here if the buffer_length=190 its generate out of memory exception.
PBYTE buf = new BYTE[buffer_length];
it means it not working after certain limit.
thanks.
|
|
|
|
|
|
If you need a dynamic array (one that changes sizes), you need to allocate it dynamically on the heap.
In C++ you use new (along with corresponding delete after you're done with it).
In C you use malloc (along with corresponding free after you're done with it).
Failure to deallocate will result in memory leaks.
In addition to those options, you can use "containers", which are essentially classes that "contain" the dynamic array. A few of these options include std::vector , std::array , among others (most libraries including MFC have at least a couple of different container options).
|
|
|
|
|
How about:
const int buffer_length = length of some string;
BYTE byte_buffer[buffer_length];
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|