blob: a10ba634967ccaca895af89cf99bf6f6da200323 [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_PREVIEW_HANDLER_H_
#define PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PREVIEW_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;
// States the preview handler can be in.
//
// When created, the handler starts in |kNotStarted| state and mostly
// transitions in sequential order of the states. When the preview is running,
// it can be set to the |kPaused| state and later resumed to |kRunning| state.
enum class PreviewState {
kNotStarted,
kStarting,
kRunning,
kPaused,
kStopping
};
// Handler for a camera's video preview.
//
// Handles preview sink initialization and manages the state of the video
// preview.
class PreviewHandler {
public:
PreviewHandler() {}
virtual ~PreviewHandler() = default;
// Prevent copying.
PreviewHandler(PreviewHandler const&) = delete;
PreviewHandler& operator=(PreviewHandler const&) = delete;
// Initializes preview sink and requests capture engine to start previewing.
// Sets preview state to: starting.
// Returns false if recording cannot be started.
//
// capture_engine: A pointer to capture engine instance. Used to start
// the actual recording.
// base_media_type: A pointer to base media type used as a base
// for the actual video capture media type.
// sample_callback: A pointer to capture engine listener.
// This is set as sample callback for preview sink.
bool StartPreview(IMFCaptureEngine* capture_engine,
IMFMediaType* base_media_type,
CaptureEngineListener* sample_callback);
// Stops existing recording.
// Returns false if recording cannot be stopped.
//
// capture_engine: A pointer to capture engine instance. Used to stop
// the ongoing recording.
bool StopPreview(IMFCaptureEngine* capture_engine);
// Set the preview handler recording state to: paused.
bool PausePreview();
// Set the preview handler recording state to: running.
bool ResumePreview();
// Set the preview handler recording state to: running.
void OnPreviewStarted();
// Returns true if preview state is running or paused.
bool IsInitialized() const {
return preview_state_ == PreviewState::kRunning ||
preview_state_ == PreviewState::kPaused;
}
// Returns true if preview state is running.
bool IsRunning() const { return preview_state_ == PreviewState::kRunning; }
// Return true if preview state is paused.
bool IsPaused() const { return preview_state_ == PreviewState::kPaused; }
// Returns true if preview state is starting.
bool IsStarting() const { return preview_state_ == PreviewState::kStarting; }
private:
// Initializes record sink for video file capture.
HRESULT InitPreviewSink(IMFCaptureEngine* capture_engine,
IMFMediaType* base_media_type,
CaptureEngineListener* sample_callback);
PreviewState preview_state_ = PreviewState::kNotStarted;
ComPtr<IMFCapturePreviewSink> preview_sink_;
};
} // namespace camera_windows
#endif // PACKAGES_CAMERA_CAMERA_WINDOWS_WINDOWS_PREVIEW_HANDLER_H_