@@ -669,6 +669,8 @@ | |||
84AF419B10F0008E0035D74F /* juce_ScopedPointer.h in Headers */ = {isa = PBXBuildFile; fileRef = 84AF3FE710EF9FF30035D74F /* juce_ScopedPointer.h */; }; | |||
84B2053E10D535EC008B4A79 /* juce_ValueTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 843D4A3A10D3C54500624BA6 /* juce_ValueTree.h */; }; | |||
84B2053F10D535EC008B4A79 /* juce_ValueTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843D4A3910D3C54500624BA6 /* juce_ValueTree.cpp */; }; | |||
84B56D231135B010004B26F7 /* juce_MouseInputSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84751E591132EE9E00640F9A /* juce_MouseInputSource.cpp */; }; | |||
84B56D241135B010004B26F7 /* juce_MouseInputSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84751E5A1132EE9E00640F9A /* juce_MouseInputSource.h */; }; | |||
84BA604010F2017A001D9D70 /* juce_Value.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84BA603E10F2017A001D9D70 /* juce_Value.cpp */; }; | |||
84BA604110F2017A001D9D70 /* juce_Value.h in Headers */ = {isa = PBXBuildFile; fileRef = 84BA603F10F2017A001D9D70 /* juce_Value.h */; }; | |||
84CABF691101292D0088D64D /* juce_TemporaryFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84CABF671101292D0088D64D /* juce_TemporaryFile.cpp */; }; | |||
@@ -3258,6 +3260,7 @@ | |||
843E5C72111394A3006F959F /* juce_DynamicObject.h in Headers */, | |||
8473E64B11249FD800D74E02 /* juce_TextInputTarget.h in Headers */, | |||
8473E6541125974600D74E02 /* juce_Range.h in Headers */, | |||
84B56D241135B010004B26F7 /* juce_MouseInputSource.h in Headers */, | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
@@ -3940,6 +3943,7 @@ | |||
84CAC0C0110478D50088D64D /* juce_TemporaryFile.cpp in Sources */, | |||
843E5C6F1113949F006F959F /* juce_NamedValueSet.cpp in Sources */, | |||
843E5C71111394A2006F959F /* juce_DynamicObject.cpp in Sources */, | |||
84B56D231135B010004B26F7 /* juce_MouseInputSource.cpp in Sources */, | |||
); | |||
runOnlyForDeploymentPostprocessing = 0; | |||
}; | |||
@@ -396,6 +396,7 @@ | |||
#include <dshow.h> | |||
#include <qedit.h> | |||
#include <dshowasf.h> | |||
#endif | |||
#if JUCE_WASAPI | |||
@@ -227419,11 +227420,8 @@ public: | |||
{ | |||
ComSmartPtr <IAMStreamConfig> streamConfig; | |||
hr = captureGraphBuilder->FindInterface (&PIN_CATEGORY_CAPTURE, | |||
0, | |||
filter, | |||
IID_IAMStreamConfig, | |||
(void**) &streamConfig); | |||
hr = captureGraphBuilder->FindInterface (&PIN_CATEGORY_CAPTURE, 0, filter, | |||
IID_IAMStreamConfig, (void**) &streamConfig); | |||
if (streamConfig != 0) | |||
{ | |||
@@ -227521,8 +227519,7 @@ public: | |||
smartTee = 0; | |||
smartTeePreviewOutputPin = 0; | |||
smartTeeCaptureOutputPin = 0; | |||
mux = 0; | |||
fileWriter = 0; | |||
asfWriter = 0; | |||
delete activeImage; | |||
delete loadingImage; | |||
@@ -227618,56 +227615,59 @@ public: | |||
firstRecordedTime = Time(); | |||
recordNextFrameTime = true; | |||
HRESULT hr = mux.CoCreateInstance (CLSID_AviDest, CLSCTX_INPROC_SERVER); | |||
HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter, CLSCTX_INPROC_SERVER); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = graphBuilder->AddFilter (mux, _T("AVI Mux")); | |||
ComSmartPtr <IFileSinkFilter> fileSink; | |||
hr = asfWriter->QueryInterface (IID_IFileSinkFilter, (void**) &fileSink); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = fileWriter.CoCreateInstance (CLSID_FileWriter, CLSCTX_INPROC_SERVER); | |||
hr = fileSink->SetFileName (file.getFullPathName(), 0); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
ComSmartPtr <IFileSinkFilter> fileSink; | |||
hr = fileWriter->QueryInterface (IID_IFileSinkFilter, (void**) &fileSink); | |||
hr = graphBuilder->AddFilter (asfWriter, _T("AsfWriter")); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
AM_MEDIA_TYPE mt; | |||
zerostruct (mt); | |||
mt.majortype = MEDIATYPE_Stream; | |||
mt.subtype = MEDIASUBTYPE_Avi; | |||
mt.formattype = FORMAT_VideoInfo; | |||
hr = fileSink->SetFileName (file.getFullPathName(), &mt); | |||
ComSmartPtr <IConfigAsfWriter> asfConfig; | |||
hr = asfWriter->QueryInterface (IID_IConfigAsfWriter, (void**) &asfConfig); | |||
asfConfig->SetIndexMode (true); | |||
ComSmartPtr <IWMProfileManager> profileManager; | |||
hr = WMCreateProfileManager (&profileManager); | |||
// This gibberish is the DirectShow profile for a video-only wmv file. | |||
String prof ("<profile version=\"589824\" storageformat=\"1\" name=\"Quality\" description=\"Quality type for output.\"><streamconfig " | |||
"majortype=\"{73646976-0000-0010-8000-00AA00389B71}\" streamnumber=\"1\" streamname=\"Video Stream\" inputname=\"Video409\" bitrate=\"894960\" " | |||
"bufferwindow=\"0\" reliabletransport=\"1\" decodercomplexity=\"AU\" rfc1766langid=\"en-us\"><videomediaprops maxkeyframespacing=\"50000000\" quality=\"90\"/>" | |||
"<wmmediatype subtype=\"{33564D57-0000-0010-8000-00AA00389B71}\" bfixedsizesamples=\"0\" btemporalcompression=\"1\" lsamplesize=\"0\"> <videoinfoheader " | |||
"dwbitrate=\"894960\" dwbiterrorrate=\"0\" avgtimeperframe=\"100000\"><rcsource left=\"0\" top=\"0\" right=\"$WIDTH\" bottom=\"$HEIGHT\"/> <rctarget " | |||
"left=\"0\" top=\"0\" right=\"$WIDTH\" bottom=\"$HEIGHT\"/> <bitmapinfoheader biwidth=\"$WIDTH\" biheight=\"$HEIGHT\" biplanes=\"1\" bibitcount=\"24\" " | |||
"bicompression=\"WMV3\" bisizeimage=\"0\" bixpelspermeter=\"0\" biypelspermeter=\"0\" biclrused=\"0\" biclrimportant=\"0\"/> " | |||
"</videoinfoheader></wmmediatype></streamconfig></profile>"); | |||
prof = prof.replace (T("$WIDTH"), String (width)) | |||
.replace (T("$HEIGHT"), String (height)); | |||
ComSmartPtr <IWMProfile> currentProfile; | |||
hr = profileManager->LoadProfileByData ((const WCHAR*) prof, ¤tProfile); | |||
hr = asfConfig->ConfigureFilterUsingProfile (currentProfile); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = graphBuilder->AddFilter (fileWriter, _T("File Writer")); | |||
ComSmartPtr <IPin> asfWriterInputPin; | |||
if (SUCCEEDED (hr)) | |||
if (getPin (asfWriter, PINDIR_INPUT, &asfWriterInputPin, "Video Input 01")) | |||
{ | |||
ComSmartPtr <IPin> muxInputPin, muxOutputPin, writerInput; | |||
hr = graphBuilder->Connect (smartTeeCaptureOutputPin, asfWriterInputPin); | |||
if (getPin (mux, PINDIR_INPUT, &muxInputPin) | |||
&& getPin (mux, PINDIR_OUTPUT, &muxOutputPin) | |||
&& getPin (fileWriter, PINDIR_INPUT, &writerInput)) | |||
if (SUCCEEDED (hr) | |||
&& ok && activeUsers > 0 | |||
&& SUCCEEDED (mediaControl->Run())) | |||
{ | |||
hr = graphBuilder->Connect (smartTeeCaptureOutputPin, muxInputPin); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = graphBuilder->Connect (muxOutputPin, writerInput); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
if (ok && activeUsers > 0) | |||
mediaControl->Run(); | |||
return true; | |||
} | |||
} | |||
return true; | |||
} | |||
} | |||
} | |||
@@ -227688,16 +227688,10 @@ public: | |||
{ | |||
mediaControl->Stop(); | |||
if (mux != 0) | |||
if (asfWriter != 0) | |||
{ | |||
graphBuilder->RemoveFilter (mux); | |||
mux = 0; | |||
} | |||
if (fileWriter != 0) | |||
{ | |||
graphBuilder->RemoveFilter (fileWriter); | |||
fileWriter = 0; | |||
graphBuilder->RemoveFilter (asfWriter); | |||
asfWriter = 0; | |||
} | |||
if (ok && activeUsers > 0) | |||
@@ -227801,7 +227795,7 @@ private: | |||
ComSmartPtr <IMediaControl> mediaControl; | |||
ComSmartPtr <IPin> smartTeePreviewOutputPin; | |||
ComSmartPtr <IPin> smartTeeCaptureOutputPin; | |||
ComSmartPtr <IBaseFilter> mux, fileWriter; | |||
ComSmartPtr <IBaseFilter> asfWriter; | |||
int activeUsers; | |||
Array <int> widths, heights; | |||
DWORD graphRegistrationID; | |||
@@ -228055,10 +228049,10 @@ Component* CameraDevice::createViewerComponent() | |||
const String CameraDevice::getFileExtension() | |||
{ | |||
return ".avi"; | |||
return ".wmv"; | |||
} | |||
void CameraDevice::startRecordingToFile (const File& file, int /*quality*/) | |||
void CameraDevice::startRecordingToFile (const File& file, int quality) | |||
{ | |||
stopRecording(); | |||
@@ -228240,6 +228234,7 @@ CameraDevice* CameraDevice::openDevice (int index, | |||
#if JUCE_USE_CAMERA | |||
#pragma comment (lib, "Strmiids.lib") | |||
#pragma comment (lib, "wmvcore.lib") | |||
#endif | |||
/*** End of inlined file: juce_win32_AutoLinkLibraries.h ***/ | |||
@@ -43,7 +43,7 @@ | |||
#define JUCE_MAJOR_VERSION 1 | |||
#define JUCE_MINOR_VERSION 51 | |||
#define JUCE_BUILDNUMBER 3 | |||
#define JUCE_BUILDNUMBER 4 | |||
#define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8) + JUCE_BUILDNUMBER) | |||
@@ -28339,6 +28339,7 @@ END_JUCE_NAMESPACE | |||
#if JUCE_USE_CAMERA | |||
#pragma comment (lib, "Strmiids.lib") | |||
#pragma comment (lib, "wmvcore.lib") | |||
#endif | |||
/*** End of inlined file: juce_win32_AutoLinkLibraries.h ***/ | |||
@@ -33,7 +33,7 @@ | |||
*/ | |||
#define JUCE_MAJOR_VERSION 1 | |||
#define JUCE_MINOR_VERSION 51 | |||
#define JUCE_BUILDNUMBER 3 | |||
#define JUCE_BUILDNUMBER 4 | |||
/** Current Juce version number. | |||
@@ -26,4 +26,5 @@ | |||
#if JUCE_USE_CAMERA | |||
#pragma comment (lib, "Strmiids.lib") | |||
#pragma comment (lib, "wmvcore.lib") | |||
#endif |
@@ -64,11 +64,8 @@ public: | |||
{ | |||
ComSmartPtr <IAMStreamConfig> streamConfig; | |||
hr = captureGraphBuilder->FindInterface (&PIN_CATEGORY_CAPTURE, | |||
0, | |||
filter, | |||
IID_IAMStreamConfig, | |||
(void**) &streamConfig); | |||
hr = captureGraphBuilder->FindInterface (&PIN_CATEGORY_CAPTURE, 0, filter, | |||
IID_IAMStreamConfig, (void**) &streamConfig); | |||
if (streamConfig != 0) | |||
{ | |||
@@ -166,8 +163,7 @@ public: | |||
smartTee = 0; | |||
smartTeePreviewOutputPin = 0; | |||
smartTeeCaptureOutputPin = 0; | |||
mux = 0; | |||
fileWriter = 0; | |||
asfWriter = 0; | |||
delete activeImage; | |||
delete loadingImage; | |||
@@ -263,56 +259,59 @@ public: | |||
firstRecordedTime = Time(); | |||
recordNextFrameTime = true; | |||
HRESULT hr = mux.CoCreateInstance (CLSID_AviDest, CLSCTX_INPROC_SERVER); | |||
HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter, CLSCTX_INPROC_SERVER); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = graphBuilder->AddFilter (mux, _T("AVI Mux")); | |||
ComSmartPtr <IFileSinkFilter> fileSink; | |||
hr = asfWriter->QueryInterface (IID_IFileSinkFilter, (void**) &fileSink); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = fileWriter.CoCreateInstance (CLSID_FileWriter, CLSCTX_INPROC_SERVER); | |||
hr = fileSink->SetFileName (file.getFullPathName(), 0); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
ComSmartPtr <IFileSinkFilter> fileSink; | |||
hr = fileWriter->QueryInterface (IID_IFileSinkFilter, (void**) &fileSink); | |||
hr = graphBuilder->AddFilter (asfWriter, _T("AsfWriter")); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
AM_MEDIA_TYPE mt; | |||
zerostruct (mt); | |||
mt.majortype = MEDIATYPE_Stream; | |||
mt.subtype = MEDIASUBTYPE_Avi; | |||
mt.formattype = FORMAT_VideoInfo; | |||
hr = fileSink->SetFileName (file.getFullPathName(), &mt); | |||
ComSmartPtr <IConfigAsfWriter> asfConfig; | |||
hr = asfWriter->QueryInterface (IID_IConfigAsfWriter, (void**) &asfConfig); | |||
asfConfig->SetIndexMode (true); | |||
ComSmartPtr <IWMProfileManager> profileManager; | |||
hr = WMCreateProfileManager (&profileManager); | |||
// This gibberish is the DirectShow profile for a video-only wmv file. | |||
String prof ("<profile version=\"589824\" storageformat=\"1\" name=\"Quality\" description=\"Quality type for output.\"><streamconfig " | |||
"majortype=\"{73646976-0000-0010-8000-00AA00389B71}\" streamnumber=\"1\" streamname=\"Video Stream\" inputname=\"Video409\" bitrate=\"894960\" " | |||
"bufferwindow=\"0\" reliabletransport=\"1\" decodercomplexity=\"AU\" rfc1766langid=\"en-us\"><videomediaprops maxkeyframespacing=\"50000000\" quality=\"90\"/>" | |||
"<wmmediatype subtype=\"{33564D57-0000-0010-8000-00AA00389B71}\" bfixedsizesamples=\"0\" btemporalcompression=\"1\" lsamplesize=\"0\"> <videoinfoheader " | |||
"dwbitrate=\"894960\" dwbiterrorrate=\"0\" avgtimeperframe=\"100000\"><rcsource left=\"0\" top=\"0\" right=\"$WIDTH\" bottom=\"$HEIGHT\"/> <rctarget " | |||
"left=\"0\" top=\"0\" right=\"$WIDTH\" bottom=\"$HEIGHT\"/> <bitmapinfoheader biwidth=\"$WIDTH\" biheight=\"$HEIGHT\" biplanes=\"1\" bibitcount=\"24\" " | |||
"bicompression=\"WMV3\" bisizeimage=\"0\" bixpelspermeter=\"0\" biypelspermeter=\"0\" biclrused=\"0\" biclrimportant=\"0\"/> " | |||
"</videoinfoheader></wmmediatype></streamconfig></profile>"); | |||
prof = prof.replace (T("$WIDTH"), String (width)) | |||
.replace (T("$HEIGHT"), String (height)); | |||
ComSmartPtr <IWMProfile> currentProfile; | |||
hr = profileManager->LoadProfileByData ((const WCHAR*) prof, ¤tProfile); | |||
hr = asfConfig->ConfigureFilterUsingProfile (currentProfile); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = graphBuilder->AddFilter (fileWriter, _T("File Writer")); | |||
ComSmartPtr <IPin> asfWriterInputPin; | |||
if (SUCCEEDED (hr)) | |||
if (getPin (asfWriter, PINDIR_INPUT, &asfWriterInputPin, "Video Input 01")) | |||
{ | |||
ComSmartPtr <IPin> muxInputPin, muxOutputPin, writerInput; | |||
hr = graphBuilder->Connect (smartTeeCaptureOutputPin, asfWriterInputPin); | |||
if (getPin (mux, PINDIR_INPUT, &muxInputPin) | |||
&& getPin (mux, PINDIR_OUTPUT, &muxOutputPin) | |||
&& getPin (fileWriter, PINDIR_INPUT, &writerInput)) | |||
if (SUCCEEDED (hr) | |||
&& ok && activeUsers > 0 | |||
&& SUCCEEDED (mediaControl->Run())) | |||
{ | |||
hr = graphBuilder->Connect (smartTeeCaptureOutputPin, muxInputPin); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
hr = graphBuilder->Connect (muxOutputPin, writerInput); | |||
if (SUCCEEDED (hr)) | |||
{ | |||
if (ok && activeUsers > 0) | |||
mediaControl->Run(); | |||
return true; | |||
} | |||
} | |||
return true; | |||
} | |||
} | |||
} | |||
@@ -333,16 +332,10 @@ public: | |||
{ | |||
mediaControl->Stop(); | |||
if (mux != 0) | |||
{ | |||
graphBuilder->RemoveFilter (mux); | |||
mux = 0; | |||
} | |||
if (fileWriter != 0) | |||
if (asfWriter != 0) | |||
{ | |||
graphBuilder->RemoveFilter (fileWriter); | |||
fileWriter = 0; | |||
graphBuilder->RemoveFilter (asfWriter); | |||
asfWriter = 0; | |||
} | |||
if (ok && activeUsers > 0) | |||
@@ -450,7 +443,7 @@ private: | |||
ComSmartPtr <IMediaControl> mediaControl; | |||
ComSmartPtr <IPin> smartTeePreviewOutputPin; | |||
ComSmartPtr <IPin> smartTeeCaptureOutputPin; | |||
ComSmartPtr <IBaseFilter> mux, fileWriter; | |||
ComSmartPtr <IBaseFilter> asfWriter; | |||
int activeUsers; | |||
Array <int> widths, heights; | |||
DWORD graphRegistrationID; | |||
@@ -709,10 +702,10 @@ Component* CameraDevice::createViewerComponent() | |||
const String CameraDevice::getFileExtension() | |||
{ | |||
return ".avi"; | |||
return ".wmv"; | |||
} | |||
void CameraDevice::startRecordingToFile (const File& file, int /*quality*/) | |||
void CameraDevice::startRecordingToFile (const File& file, int quality) | |||
{ | |||
stopRecording(); | |||
@@ -127,14 +127,15 @@ | |||
/* If you're using the camera classes, you'll need access to a few DirectShow headers. | |||
Both of these files are provided in the normal Windows SDK, but some Microsoft plonker | |||
didn't realise that qedit.h doesn't actually compile without the rest of the DirectShow SDK! | |||
These files are provided in the normal Windows SDK, but some Microsoft plonker | |||
didn't realise that qedit.h doesn't actually compile without the rest of the DirectShow SDK.. | |||
Microsoft's suggested fix for this is to hack their qedit.h file! See: | |||
http://social.msdn.microsoft.com/Forums/en-US/windowssdk/thread/ed097d2c-3d68-4f48-8448-277eaaf68252 | |||
.. which is a pathetic bodge, but a lot less hassle than installing the full DShow SDK. | |||
.. which is a bit of a bodge, but a lot less hassle than installing the full DShow SDK. | |||
*/ | |||
#include <dshow.h> | |||
#include <qedit.h> | |||
#include <dshowasf.h> | |||
#endif | |||
//============================================================================== | |||