blob: c12643bef85bb11e432c812d9bda1807e0723209 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PHOTO_HANDLER_H_
#define PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PHOTO_HANDLER_H_
#include <mfapi.h>
#include <mfcaptureengine.h>
#include <wrl/client.h>
#include <memory>
#include <string>
#include "capture_engine_listener.h"
namespace camera_windows {
using Microsoft::WRL::ComPtr;
// Various states that the photo handler can be in.
//
// When created, the handler is in |kNotStarted| state and transtions in
// sequential order through the states.
enum class PhotoState {
kNotStarted,
kIdle,
kTakingPhoto,
};
// Handles photo sink initialization and tracks photo capture states.
class PhotoHandler {
public:
PhotoHandler() {}
virtual ~PhotoHandler() = default;
// Prevent copying.
PhotoHandler(PhotoHandler const&) = delete;
PhotoHandler& operator=(PhotoHandler const&) = delete;
// Initializes photo sink if not initialized and requests the capture engine
// to take photo.
//
// Sets photo state to: kTakingPhoto.
// Returns false if photo cannot be taken.
//
// capture_engine: A pointer to capture engine instance.
// Called to take the photo.
// base_media_type: A pointer to base media type used as a base
// for the actual photo capture media type.
// file_path: A string that hold file path for photo capture.
bool TakePhoto(const std::string& file_path, IMFCaptureEngine* capture_engine,
IMFMediaType* base_media_type);
// Set the photo handler recording state to: kIdle.
void OnPhotoTaken();
// Returns true if photo state is kIdle.
bool IsInitialized() const { return photo_state_ == PhotoState::kIdle; }
// Returns true if photo state is kTakingPhoto.
bool IsTakingPhoto() const {
return photo_state_ == PhotoState::kTakingPhoto;
}
// Returns the filesystem path of the captured photo.
std::string GetPhotoPath() const { return file_path_; }
private:
// Initializes record sink for video file capture.
HRESULT InitPhotoSink(IMFCaptureEngine* capture_engine,
IMFMediaType* base_media_type);
std::string file_path_;
PhotoState photo_state_ = PhotoState::kNotStarted;
ComPtr<IMFCapturePhotoSink> photo_sink_;
};
} // namespace camera_windows
#endif // PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PHOTO_HANDLER_H_