|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software Ltd.
-
- Permission is granted to use this software under the terms of either:
- a) the GPL v2 (or any later version)
- b) the Affero GPL v3
-
- Details of these licenses can be found at: www.gnu.org/licenses
-
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.juce.com for more information.
-
- ==============================================================================
- */
-
- #ifndef JUCE_CAMERADEVICE_H_INCLUDED
- #define JUCE_CAMERADEVICE_H_INCLUDED
-
- #if JUCE_USE_CAMERA || DOXYGEN
-
-
- //==============================================================================
- /**
- Controls any video capture devices that might be available.
-
- Use getAvailableDevices() to list the devices that are attached to the
- system, then call openDevice to open one for use. Once you have a CameraDevice
- object, you can get a viewer component from it, and use its methods to
- stream to a file or capture still-frames.
- */
- class JUCE_API CameraDevice
- {
- public:
- /** Destructor. */
- virtual ~CameraDevice();
-
- //==============================================================================
- /** Returns a list of the available cameras on this machine.
-
- You can open one of these devices by calling openDevice().
- */
- static StringArray getAvailableDevices();
-
- /** Opens a camera device.
-
- The index parameter indicates which of the items returned by getAvailableDevices()
- to open.
-
- The size constraints allow the method to choose between different resolutions if
- the camera supports this. If the resolution cam't be specified (e.g. on the Mac)
- then these will be ignored.
- */
- static CameraDevice* openDevice (int deviceIndex,
- int minWidth = 128, int minHeight = 64,
- int maxWidth = 1024, int maxHeight = 768);
-
- //==============================================================================
- /** Returns the name of this device */
- const String& getName() const noexcept { return name; }
-
- /** Creates a component that can be used to display a preview of the
- video from this camera.
- */
- Component* createViewerComponent();
-
- //==============================================================================
- /** Starts recording video to the specified file.
-
- You should use getFileExtension() to find out the correct extension to
- use for your filename.
-
- If the file exists, it will be deleted before the recording starts.
-
- This method may not start recording instantly, so if you need to know the
- exact time at which the file begins, you can call getTimeOfFirstRecordedFrame()
- after the recording has finished.
-
- The quality parameter can be 0, 1, or 2, to indicate low, medium, or high. It may
- or may not be used, depending on the driver.
- */
- void startRecordingToFile (const File& file, int quality = 2);
-
- /** Stops recording, after a call to startRecordingToFile(). */
- void stopRecording();
-
- /** Returns the file extension that should be used for the files
- that you pass to startRecordingToFile().
-
- This may be platform-specific, e.g. ".mov" or ".avi".
- */
- static String getFileExtension();
-
- /** After calling stopRecording(), this method can be called to return the timestamp
- of the first frame that was written to the file.
- */
- Time getTimeOfFirstRecordedFrame() const;
-
- //==============================================================================
- /**
- Receives callbacks with images from a CameraDevice.
-
- @see CameraDevice::addListener
- */
- class JUCE_API Listener
- {
- public:
- Listener() {}
- virtual ~Listener() {}
-
- /** This method is called when a new image arrives.
-
- This may be called by any thread, so be careful about thread-safety,
- and make sure that you process the data as quickly as possible to
- avoid glitching!
- */
- virtual void imageReceived (const Image& image) = 0;
- };
-
- /** Adds a listener to receive images from the camera.
-
- Be very careful not to delete the listener without first removing it by calling
- removeListener().
- */
- void addListener (Listener* listenerToAdd);
-
- /** Removes a listener that was previously added with addListener(). */
- void removeListener (Listener* listenerToRemove);
-
- private:
- String name;
-
- struct Pimpl;
- friend struct Pimpl;
- friend struct ContainerDeletePolicy<Pimpl>;
- ScopedPointer<Pimpl> pimpl;
-
- struct ViewerComponent;
- friend struct ViewerComponent;
-
- CameraDevice (const String& name, int index,
- int minWidth, int minHeight, int maxWidth, int maxHeight);
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CameraDevice)
- };
-
- #ifndef DOXYGEN
- /** This typedef is just for compatibility with VC6 - newer code should use the CameraDevice::Listener class directly. */
- typedef CameraDevice::Listener CameraImageListener;
- #endif
-
- #endif
- #endif // JUCE_CAMERADEVICE_H_INCLUDED
|