Skip to content

Commit

Permalink
[camera_windows] Set device media type for video preview explicitly (f…
Browse files Browse the repository at this point in the history
  • Loading branch information
dasyad00 authored Nov 13, 2024
1 parent 67d8b50 commit 26e123a
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 5 deletions.
4 changes: 4 additions & 0 deletions packages/camera/camera_windows/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.2.6+1

* Fixes black bars on camera preview [#122966](https://github.com/flutter/flutter/issues/122966).

## 0.2.6

* Reverts streaming frame support, as the implementation was incorrect and never
Expand Down
2 changes: 1 addition & 1 deletion packages/camera/camera_windows/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: camera_windows
description: A Flutter plugin for getting information about and controlling the camera on Windows.
repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_windows
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
version: 0.2.6
version: 0.2.6+1

environment:
sdk: ^3.3.0
Expand Down
28 changes: 24 additions & 4 deletions packages/camera/camera_windows/windows/capture_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,10 +467,15 @@ HRESULT CaptureControllerImpl::FindBaseMediaTypes() {
return hr;
}

return FindBaseMediaTypesForSource(source.Get());
}

HRESULT CaptureControllerImpl::FindBaseMediaTypesForSource(
IMFCaptureSource* source) {
// Find base media type for previewing.
if (!FindBestMediaType(
(DWORD)MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_VIDEO_PREVIEW,
source.Get(), base_preview_media_type_.GetAddressOf(),
source, base_preview_media_type_.GetAddressOf(),
GetMaxPreviewHeight(), &preview_frame_width_,
&preview_frame_height_)) {
return E_FAIL;
Expand All @@ -479,8 +484,8 @@ HRESULT CaptureControllerImpl::FindBaseMediaTypes() {
// Find base media type for record and photo capture.
if (!FindBestMediaType(
(DWORD)MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_VIDEO_RECORD,
source.Get(), base_capture_media_type_.GetAddressOf(), 0xffffffff,
nullptr, nullptr)) {
source, base_capture_media_type_.GetAddressOf(), 0xffffffff, nullptr,
nullptr)) {
return E_FAIL;
}

Expand Down Expand Up @@ -566,15 +571,30 @@ void CaptureControllerImpl::StartPreview() {

HRESULT hr = S_OK;

ComPtr<IMFCaptureSource> source;
hr = capture_engine_->GetSource(&source);
if (FAILED(hr)) {
return OnPreviewStarted(GetCameraResult(hr),
"Failed to get capture engine source");
}

if (!base_preview_media_type_) {
// Enumerates mediatypes and finds media type for video capture.
hr = FindBaseMediaTypes();
hr = FindBaseMediaTypesForSource(source.Get());
if (FAILED(hr)) {
return OnPreviewStarted(GetCameraResult(hr),
"Failed to initialize video preview");
}
}

hr = source->SetCurrentDeviceMediaType(
(DWORD)MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_VIDEO_PREVIEW,
base_preview_media_type_.Get());
if (FAILED(hr)) {
return OnPreviewStarted(GetCameraResult(hr),
"Failed to set video preview output format");
}

texture_handler_->UpdateTextureSize(preview_frame_width_,
preview_frame_height_);

Expand Down
4 changes: 4 additions & 0 deletions packages/camera/camera_windows/windows/capture_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,10 @@ class CaptureControllerImpl : public CaptureController,
// for preview and video capture.
HRESULT FindBaseMediaTypes();

// Enumerates video_sources media types and finds out best resolution
// for a given source.
HRESULT FindBaseMediaTypesForSource(IMFCaptureSource* source);

// Stops preview. Called internally on camera reset and dispose.
HRESULT StopPreview();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,15 @@ void MockStartPreview(CaptureControllerImpl* capture_controller,
MockAvailableMediaTypes(engine, capture_source.Get(), mock_preview_width,
mock_preview_height);

EXPECT_CALL(
*capture_source.Get(),
SetCurrentDeviceMediaType(
Eq((DWORD)
MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_VIDEO_PREVIEW),
_))
.Times(1)
.WillOnce(Return(S_OK));

EXPECT_CALL(*engine, StartPreview()).Times(1).WillOnce(Return(S_OK));

// Called by destructor
Expand Down

0 comments on commit 26e123a

Please sign in to comment.