Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[camera_windows] Set device media type for video preview explicitly #7447

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For versions <1, Dart convention is to use the build number for bugfixes, so this should be 0.2.5+1.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have fixed the versioning in 4ffbedd


* 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
27 changes: 23 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,14 @@ HRESULT CaptureControllerImpl::FindBaseMediaTypes() {
return hr;
}

return FindBaseMediaTypes(source.Get());
}

HRESULT CaptureControllerImpl::FindBaseMediaTypes(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 +483,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 +570,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 initialize video preview");
}

if (!base_preview_media_type_) {
// Enumerates mediatypes and finds media type for video capture.
hr = FindBaseMediaTypes();
hr = FindBaseMediaTypes(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 initialize video preview");
}

texture_handler_->UpdateTextureSize(preview_frame_width_,
preview_frame_height_);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ class CaptureControllerImpl : public CaptureController,
// Enumerates video_sources media types and finds out best resolution
// for preview and video capture.
HRESULT FindBaseMediaTypes();
HRESULT FindBaseMediaTypes(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