diff --git a/Userland/Applications/CMakeLists.txt b/Userland/Applications/CMakeLists.txt index 9a9674c5f18..0db8bcbcca4 100644 --- a/Userland/Applications/CMakeLists.txt +++ b/Userland/Applications/CMakeLists.txt @@ -28,4 +28,5 @@ add_subdirectory(SystemMonitor) add_subdirectory(ThemeEditor) add_subdirectory(Terminal) add_subdirectory(TextEditor) +add_subdirectory(VideoPlayer) add_subdirectory(Welcome) diff --git a/Userland/Applications/VideoPlayer/CMakeLists.txt b/Userland/Applications/VideoPlayer/CMakeLists.txt new file mode 100644 index 00000000000..f9f1a7422f3 --- /dev/null +++ b/Userland/Applications/VideoPlayer/CMakeLists.txt @@ -0,0 +1,6 @@ +set(SOURCES + main.cpp +) + +serenity_bin(VideoPlayer) +target_link_libraries(VideoPlayer LibVideo LibAudio LibGUI) diff --git a/Userland/Applications/VideoPlayer/main.cpp b/Userland/Applications/VideoPlayer/main.cpp new file mode 100644 index 00000000000..5978a4f1af5 --- /dev/null +++ b/Userland/Applications/VideoPlayer/main.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021, Hunter Salyer + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + auto app = GUI::Application::construct(argc, argv); + auto window = GUI::Window::construct(); + + auto document = Video::MatroskaReader::parse_matroska_from_file("/home/anon/Videos/test-webm.webm"); + const auto& optional_track = document->track_for_track_type(Video::TrackEntry::TrackType::Video); + if (!optional_track.has_value()) + return 1; + const auto& track = optional_track.value(); + const auto video_track = track.video_track().value(); + + auto image = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRx8888, Gfx::IntSize(video_track.pixel_height, video_track.pixel_width)); + auto& main_widget = window->set_main_widget(); + main_widget.set_fill_with_background_color(true); + main_widget.set_layout(); + auto& image_widget = main_widget.add(); + image_widget.set_bitmap(image); + image_widget.set_fixed_size(video_track.pixel_height, video_track.pixel_width); + main_widget.add_child(image_widget); + + Video::VP9::Decoder vp9_decoder; + for (const auto& cluster : document->clusters()) { + for (const auto& block : cluster.blocks()) { + if (block.track_number() != track.track_number()) + continue; + + const auto& frame = block.frame(0); + dbgln("Reading frame 0 from block @ {}", block.timestamp()); + vp9_decoder.parse_frame(frame); + vp9_decoder.dump_info(); + } + } + + window->show(); + return app->exec(); +}