mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 06:57:44 +00:00
VideoPlayer: Start fleshing out the user interface
This adds player widget with working play/pause controls, a seek bar which currently only displays the current playback position, and a button to cycle between the scaling modes. The player uses the new PlaybackManager class to handle demuxing, decoding, and frame presentation timing. Currently, the volume control is non-functional.
This commit is contained in:
parent
353e1c2b4d
commit
f99d356a17
6 changed files with 429 additions and 82 deletions
91
Userland/Applications/VideoPlayer/VideoFrameWidget.cpp
Normal file
91
Userland/Applications/VideoPlayer/VideoFrameWidget.cpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibGUI/Painter.h>
|
||||
#include <LibGfx/Bitmap.h>
|
||||
|
||||
#include "VideoFrameWidget.h"
|
||||
|
||||
namespace VideoPlayer {
|
||||
|
||||
VideoFrameWidget::VideoFrameWidget()
|
||||
{
|
||||
set_auto_resize(true);
|
||||
}
|
||||
|
||||
void VideoFrameWidget::set_bitmap(Gfx::Bitmap const* bitmap)
|
||||
{
|
||||
if (m_bitmap == bitmap)
|
||||
return;
|
||||
|
||||
m_bitmap = bitmap;
|
||||
if (m_bitmap && m_auto_resize)
|
||||
set_fixed_size(m_bitmap->size());
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void VideoFrameWidget::set_auto_resize(bool value)
|
||||
{
|
||||
m_auto_resize = value;
|
||||
|
||||
if (m_bitmap)
|
||||
set_fixed_size(m_bitmap->size());
|
||||
}
|
||||
|
||||
void VideoFrameWidget::mousedown_event(GUI::MouseEvent&)
|
||||
{
|
||||
if (on_click)
|
||||
on_click();
|
||||
}
|
||||
|
||||
void VideoFrameWidget::paint_event(GUI::PaintEvent& event)
|
||||
{
|
||||
Frame::paint_event(event);
|
||||
|
||||
GUI::Painter painter(*this);
|
||||
painter.add_clip_rect(event.rect());
|
||||
|
||||
painter.fill_rect(frame_inner_rect(), Gfx::Color::Black);
|
||||
|
||||
if (!m_bitmap)
|
||||
return;
|
||||
|
||||
if (m_sizing_mode == VideoSizingMode::Stretch) {
|
||||
painter.draw_scaled_bitmap(frame_inner_rect(), *m_bitmap, m_bitmap->rect(), 1.0f, Gfx::Painter::ScalingMode::BilinearBlend);
|
||||
return;
|
||||
}
|
||||
|
||||
auto center = frame_inner_rect().center();
|
||||
|
||||
if (m_sizing_mode == VideoSizingMode::FullSize) {
|
||||
painter.blit(center.translated(-m_bitmap->width() / 2, -m_bitmap->height() / 2), *m_bitmap, m_bitmap->rect());
|
||||
return;
|
||||
}
|
||||
|
||||
VERIFY(m_sizing_mode < VideoSizingMode::Sentinel);
|
||||
|
||||
auto aspect_ratio = m_bitmap->width() / static_cast<float>(m_bitmap->height());
|
||||
auto display_aspect_ratio = frame_inner_rect().width() / static_cast<float>(frame_inner_rect().height());
|
||||
|
||||
Gfx::IntSize display_size;
|
||||
if ((display_aspect_ratio > aspect_ratio) == (m_sizing_mode == VideoSizingMode::Fit)) {
|
||||
display_size = {
|
||||
(frame_inner_rect().height() * m_bitmap->width()) / m_bitmap->height(),
|
||||
frame_inner_rect().height(),
|
||||
};
|
||||
} else {
|
||||
display_size = {
|
||||
frame_inner_rect().width(),
|
||||
(frame_inner_rect().width() * m_bitmap->height()) / m_bitmap->width(),
|
||||
};
|
||||
}
|
||||
|
||||
auto display_rect = Gfx::IntRect(center.translated(-display_size.width() / 2, -display_size.height() / 2), display_size);
|
||||
painter.draw_scaled_bitmap(display_rect, *m_bitmap, m_bitmap->rect(), 1.0f, Gfx::Painter::ScalingMode::BilinearBlend);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue