Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
939eeb5
refactor: 增加 IMediaDevices 服务
ArgoZhang May 1, 2025
95fc5ed
doc: 更新示例
ArgoZhang May 1, 2025
9350eec
feat: 增加 media 脚本
ArgoZhang May 1, 2025
ebcca89
feat: 增加 IMediaDeviceInfo 接口
ArgoZhang May 1, 2025
c42dab6
doc: 更新示例
ArgoZhang May 1, 2025
d31e559
refactor: 增加 getUserMedia 方法
ArgoZhang May 1, 2025
ca78fe9
feat: 增加视频功能
ArgoZhang May 1, 2025
53d788a
doc: 增加示例
ArgoZhang May 1, 2025
912503a
feat: 增加 IMeidaVideo 接口服务
ArgoZhang May 2, 2025
c9cf582
doc: 更新示例
ArgoZhang May 2, 2025
ac7faec
refactor: 优化 registerBootstrapBlazorModule 方法
ArgoZhang May 2, 2025
cc37a8a
feat: 增加 drawImage 方法
ArgoZhang May 2, 2025
1cf7e5a
refactor: 移除 GetDisplayMedia 方法
ArgoZhang May 2, 2025
63d1f6c
feat: 精简代码
ArgoZhang May 2, 2025
890a515
doc: 更新示例
ArgoZhang May 2, 2025
560379a
Merge branch 'main' into feat-media
ArgoZhang May 2, 2025
21d216c
refactor: 重构 IMediaVideo 接口
ArgoZhang May 2, 2025
cb4f77e
refactor: 更新脚本
ArgoZhang May 2, 2025
62ab88d
refactor: 重构代码
ArgoZhang May 2, 2025
9553e17
doc: 更新示例
ArgoZhang May 2, 2025
9555a5c
refactor: 更新接口
ArgoZhang May 2, 2025
2299067
refactor: 增加镜头翻转功能
ArgoZhang May 2, 2025
5e4ee67
refactor: 更改服务名称
ArgoZhang May 2, 2025
5a8f7bd
feat: 更新 open close 方法实现逻辑
ArgoZhang May 2, 2025
38f07b9
doc: 更新示例
ArgoZhang May 2, 2025
3acbb27
feat: 实现 GetPreviewUrl 方法
ArgoZhang May 2, 2025
3bddd3c
doc: 更新示例
ArgoZhang May 2, 2025
4515544
refactor: 精简代码
ArgoZhang May 2, 2025
7f0d7e9
refactor: 增加翻转功能
ArgoZhang May 2, 2025
6f8e7f3
doc: 更新示例代码
ArgoZhang May 2, 2025
8c1edfe
chore: 增加源码映射文件
ArgoZhang May 2, 2025
9a9237f
doc: 增加菜单
ArgoZhang May 2, 2025
f7d7251
doc: 更改示例文档名称
ArgoZhang May 2, 2025
885651e
doc: 更新文档
ArgoZhang May 2, 2025
ea65373
test: 增加单元测试
ArgoZhang May 2, 2025
18d561a
chore: bump version 9.6.1-beta01
ArgoZhang May 2, 2025
d6d62b7
Merge branch 'chore-version' into feat-media
ArgoZhang May 2, 2025
ee34de8
refactor: 撤销 Flip 方法
ArgoZhang May 2, 2025
e549994
doc: 撤销更改
ArgoZhang May 2, 2025
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
42 changes: 42 additions & 0 deletions src/BootstrapBlazor.Server/Components/Samples/MediaDevice.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
@page "/media-device"
@inject IStringLocalizer<MediaDevice> Localizer

<h3>@Localizer["MediaDeviceTitle"]</h3>

<h4>@Localizer["MediaDeviceIntro"]</h4>

<p>@((MarkupString)Localizer["MediaDeviceDescription"].Value)</p>

<Pre>[Inject, NotNull]
private IBluetooth? BluetoothService { get; set; }</Pre>

<Tips>
<ul class="ul-demo">
<li>@((MarkupString)Localizer["MediaDeviceTipsLi1"].Value)</li>
<li>@((MarkupString)Localizer["MediaDeviceTipsLi2"].Value)</li>
</ul>
<div>@((MarkupString)Localizer["MediaDeviceTipsTitle"].Value)</div>
</Tips>

<DemoBlock Title="@Localizer["BaseUsageTitle"]"
Introduction="@Localizer["BaseUsageIntro"]"
Name="Normal">
<section ignore>
@Localizer["UsageDesc"]
</section>
<div class="row form-inline g-3">
<div class="col-12">
<Button Text="@Localizer["MediaDeviceRequestText"]" Icon="fa-solid fa-photo-film" OnClick="OnRequestDevice"></Button>
<Button Text="@Localizer["MediaDeviceOpenText"]" Icon="fa-solid fa-play" OnClick="OnOpenVideo"></Button>
<Button Text="@Localizer["MediaDeviceCloseText"]" Icon="fa-solid fa-stop" OnClick="OnCloseVideo"></Button>
<Button Text="@Localizer["MediaDeviceCaptureText"]" Icon="fa-solid fa-camera" OnClick="OnCapture"></Button>
</div>
</div>

<Select Items="@_items" @bind-Value="_deviceId"></Select>

<video class="bb-video" muted playsinline autoplay style="height: auto; width: auto;"></video>

<canvas class="b-video-image"></canvas>
</DemoBlock>

54 changes: 54 additions & 0 deletions src/BootstrapBlazor.Server/Components/Samples/MediaDevice.razor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Server.Components.Samples;

/// <summary>
///
/// </summary>
public partial class MediaDevice
{
[Inject, NotNull]
private IMediaVideo? VideoDeviceService { get; set; }

private readonly List<IMediaDeviceInfo> _devices = [];

private List<SelectedItem> _items = [];

private string? _deviceId;

private async Task OnRequestDevice()
{
var devices = await VideoDeviceService.GetDevices();
if (devices != null)
{
_devices.AddRange(devices);
_items = [.. _devices.Select(i => new SelectedItem(i.DeviceId, i.Label))];
}
}

private async Task OnOpenVideo()
{
if (!string.IsNullOrEmpty(_deviceId))
{
var constraints = new MediaTrackConstraints
{
DeviceId = _deviceId,
VideoSelector = ".bb-video"
};
await VideoDeviceService.Open(constraints);
}
}

private async Task OnCloseVideo()
{
await VideoDeviceService.Close(".bb-video");
}

private async Task OnCapture()
{
await VideoDeviceService.Capture(".bb-video");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ public static IServiceCollection AddBootstrapBlazor(this IServiceCollection serv
services.TryAddScoped<IBrowserFingerService, DefaultBrowserFingerService>();
services.TryAddScoped<ISerialService, DefaultSerialService>();
services.TryAddScoped<IBluetooth, DefaultBluetooth>();
services.TryAddScoped<IMediaDevices, DefaultMediaDevices>();
services.TryAddScoped<IMediaVideo, DefaultMediaVideo>();
services.AddScoped<TabItemTextOptions>();
services.AddScoped<DialogService>();
services.AddScoped<MaskService>();
Expand Down
43 changes: 43 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

class DefaultMediaDevices(IJSRuntime jsRuntime) : IMediaDevices

Check warning on line 8 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L8

Added line #L8 was not covered by tests
{
private DotNetObjectReference<DefaultMediaDevices>? _interop = null;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (bug_risk): Dispose DotNetObjectReference to prevent memory leaks.

Implement IAsyncDisposable (or manually dispose) to release the _interop DotNetObjectReference created in LoadModule when the service is disposed.

Suggested implementation:

class DefaultMediaDevices(IJSRuntime jsRuntime) : IMediaDevices, IAsyncDisposable
    private DotNetObjectReference<DefaultMediaDevices>? _interop = null;
    // ... existing code ...
    private async Task<JSModule> LoadModule()
    {
        _interop ??= DotNetObjectReference.Create(this);
    // Other existing methods...

    public async ValueTask DisposeAsync()
    {
        if (_module is not null)
        {
            await _module.DisposeAsync();
            _module = null;
        }
        if (_interop is not null)
        {
            _interop.Dispose();
            _interop = null;
        }
    }

private JSModule? _module = null;

Check warning on line 11 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L10-L11

Added lines #L10 - L11 were not covered by tests

private async Task<JSModule> LoadModule()
{

Check warning on line 14 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L14

Added line #L14 was not covered by tests
_interop ??= DotNetObjectReference.Create(this);
_module ??= await jsRuntime.LoadModuleByName("media");
return _module;
}

Check warning on line 18 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L17-L18

Added lines #L17 - L18 were not covered by tests

public async Task<IEnumerable<IMediaDeviceInfo>?> EnumerateDevices()
{
var module = await LoadModule();
return await module.InvokeAsync<List<MediaDeviceInfo>?>("enumerateDevices");
}

Check warning on line 24 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L21-L24

Added lines #L21 - L24 were not covered by tests

public async Task Open(MediaTrackConstraints constraints)
{
var module = await LoadModule();
await module.InvokeVoidAsync("open", constraints);
}

Check warning on line 30 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L27-L30

Added lines #L27 - L30 were not covered by tests

public async Task Close(string selector)
{
var module = await LoadModule();
await module.InvokeVoidAsync("close", selector);
}

Check warning on line 36 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L33-L36

Added lines #L33 - L36 were not covered by tests

public async Task Capture(string selector)
{
var module = await LoadModule();
await module.InvokeVoidAsync("capture", selector);
}

Check warning on line 42 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaDevices.cs#L39-L42

Added lines #L39 - L42 were not covered by tests
}
39 changes: 39 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

class DefaultMediaVideo(IMediaDevices deviceService) : IMediaVideo

Check warning on line 8 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs#L8

Added line #L8 was not covered by tests
{
/// <summary>
/// <inheritdoc/>
/// </summary>
/// <returns></returns>
public async Task<List<IMediaDeviceInfo>?> GetDevices()
{
var ret = new List<IMediaDeviceInfo>();
var devices = await deviceService.EnumerateDevices();

Check warning on line 17 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs#L15-L17

Added lines #L15 - L17 were not covered by tests
if (devices != null)
{
ret.AddRange(devices.Where(d => d.Kind == "videoinput"));
}
return ret;
}

Check warning on line 23 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs#L19-L23

Added lines #L19 - L23 were not covered by tests

public Task Open(MediaTrackConstraints constraints)
{
return deviceService.Open(constraints);
}

Check warning on line 28 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs#L26-L28

Added lines #L26 - L28 were not covered by tests

public Task Close(string selector)
{
return deviceService.Close(selector);
}

Check warning on line 33 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs#L31-L33

Added lines #L31 - L33 were not covered by tests

public Task Capture(string selector)
{
return deviceService.Capture(selector);
}

Check warning on line 38 in src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/DefaultMediaVideo.cs#L36-L38

Added lines #L36 - L38 were not covered by tests
}
13 changes: 13 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/DisplayMediaOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

/// <summary>
///
/// </summary>
public class DisplayMediaOptions
{
}
32 changes: 32 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/IMediaDeviceInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

/// <summary>
/// The MediaDeviceInfo interface of the Media Capture and Streams API contains information that describes a single media input or output device.
/// </summary>
public interface IMediaDeviceInfo
{
/// <summary>
/// The deviceId read-only property of the MediaDeviceInfo interface returns a string that is an identifier for the represented device and is persisted across sessions.
/// </summary>
public string DeviceId { get; }

/// <summary>
/// The groupId read-only property of the MediaDeviceInfo interface returns a string that is a group identifier.
/// </summary>
public string GroupId { get; }

/// <summary>
/// The kind read-only property of the MediaDeviceInfo interface returns an enumerated value, that is either "videoinput", "audioinput" or "audiooutput".
/// </summary>
public string Kind { get; }

/// <summary>
/// The label read-only property of the MediaDeviceInfo interface returns a string describing this device (for example "External USB Webcam").
/// </summary>
public string Label { get; }
}
39 changes: 39 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/IMediaDevices.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

/// <summary>
/// The MediaDevices interface of the Media Capture and Streams API provides access to connected media input devices like cameras and microphones, as well as screen sharing. In essence, it lets you obtain access to any hardware source of media data.
/// </summary>
public interface IMediaDevices
{
/// <summary>
/// An array of MediaDeviceInfo objects. Each object in the array describes one of the available media input and output devices.
/// </summary>
/// <returns></returns>
Task<IEnumerable<IMediaDeviceInfo>?> EnumerateDevices();

/// <summary>
/// The open() method of the MediaDevices interface creates a new MediaStream object and starts capturing media from the specified device.
/// </summary>
/// <param name="constraints"></param>
/// <returns></returns>
Task Open(MediaTrackConstraints constraints);

/// <summary>
/// The close() method of the MediaDevices interface stops capturing media from the specified device and closes the MediaStream object.
/// </summary>
/// <param name="selector"></param>
/// <returns></returns>
Task Close(string selector);

/// <summary>
/// The capture() method of the MediaDevices interface captures a still image from the specified video stream and saves it to the specified location.
/// </summary>
/// <param name="selector"></param>
/// <returns></returns>
Task Capture(string selector);
}
39 changes: 39 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/IMediaVideo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

/// <summary>
///
/// </summary>
public interface IMediaVideo
{
/// <summary>
///
/// </summary>
/// <returns></returns>
Task<List<IMediaDeviceInfo>?> GetDevices();

/// <summary>
///
/// </summary>
/// <param name="constraints"></param>
/// <returns></returns>
Task Open(MediaTrackConstraints constraints);

/// <summary>
///
/// </summary>
/// <param name="selector"></param>
/// <returns></returns>
Task Close(string selector);

/// <summary>
///
/// </summary>
/// <param name="selector"></param>
/// <returns></returns>
Task Capture(string selector);
}
17 changes: 17 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

class MediaDeviceInfo : IMediaDeviceInfo
{
public string DeviceId { get; set; } = "";

Check warning on line 10 in src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs#L10

Added line #L10 was not covered by tests

public string GroupId { get; set; } = "";

Check warning on line 12 in src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs#L12

Added line #L12 was not covered by tests

public string Kind { get; set; } = "";

Check warning on line 14 in src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs#L14

Added line #L14 was not covered by tests

public string Label { get; set; } = "";

Check warning on line 16 in src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaDeviceInfo.cs#L16

Added line #L16 was not covered by tests
}
13 changes: 13 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/MediaStream.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

/// <summary>
/// The MediaStream interface of the Media Capture and Streams API represents a stream of media content. A stream consists of several tracks, such as video or audio tracks. Each track is specified as an instance of MediaStreamTrack.
/// </summary>
public class MediaStream
{
}
37 changes: 37 additions & 0 deletions src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Components;

/// <summary>
/// The MediaTrackConstraints interface of the Media Capture and Streams API is used to specify constraints on the media tracks that are requested from a media device. It is used in conjunction with the getUserMedia() method to specify the desired properties of the media tracks, such as resolution, frame rate, and aspect ratio.
/// </summary>
public class MediaTrackConstraints
{
/// <summary>
///
/// </summary>
public string DeviceId { get; set; } = "";

Check warning on line 16 in src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs#L16

Added line #L16 was not covered by tests

/// <summary>
///
/// </summary>
public string? VideoSelector { get; set; }

Check warning on line 21 in src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs#L21

Added line #L21 was not covered by tests

/// <summary>
///
/// </summary>
public int Width { get; set; }

Check warning on line 26 in src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs#L26

Added line #L26 was not covered by tests

/// <summary>
///
/// </summary>
public int Height { get; set; }

Check warning on line 31 in src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs#L31

Added line #L31 was not covered by tests

/// <summary>
///
/// </summary>
public string? FacingMode { get; set; }

Check warning on line 36 in src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs

View check run for this annotation

Codecov / codecov/patch

src/BootstrapBlazor/Services/MediaDevices/MediaTrackConstraints.cs#L36

Added line #L36 was not covered by tests
}
Loading