mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:12:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/ByteBuffer.h>
 | |
| #include <AK/FixedArray.h>
 | |
| #include <LibGfx/Bitmap.h>
 | |
| #include <LibGfx/Size.h>
 | |
| #include <LibVideo/Color/CodingIndependentCodePoints.h>
 | |
| #include <LibVideo/DecoderError.h>
 | |
| 
 | |
| namespace Video {
 | |
| 
 | |
| class VideoFrame {
 | |
| 
 | |
| public:
 | |
|     virtual ~VideoFrame() { }
 | |
| 
 | |
|     virtual DecoderErrorOr<void> output_to_bitmap(Gfx::Bitmap& bitmap) = 0;
 | |
|     virtual DecoderErrorOr<NonnullRefPtr<Gfx::Bitmap>> to_bitmap()
 | |
|     {
 | |
|         auto bitmap = DECODER_TRY_ALLOC(Gfx::Bitmap::create(Gfx::BitmapFormat::BGRx8888, m_size));
 | |
|         TRY(output_to_bitmap(bitmap));
 | |
|         return bitmap;
 | |
|     }
 | |
| 
 | |
|     inline Gfx::IntSize size() { return m_size; }
 | |
|     inline size_t width() { return size().width(); }
 | |
|     inline size_t height() { return size().height(); }
 | |
| 
 | |
|     inline u8 bit_depth() { return m_bit_depth; }
 | |
|     inline CodingIndependentCodePoints& cicp() { return m_cicp; }
 | |
| 
 | |
| protected:
 | |
|     VideoFrame(Gfx::IntSize size,
 | |
|         u8 bit_depth, CodingIndependentCodePoints cicp)
 | |
|         : m_size(size)
 | |
|         , m_bit_depth(bit_depth)
 | |
|         , m_cicp(cicp)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Gfx::IntSize m_size;
 | |
|     u8 m_bit_depth;
 | |
|     CodingIndependentCodePoints m_cicp;
 | |
| };
 | |
| 
 | |
| class SubsampledYUVFrame : public VideoFrame {
 | |
| 
 | |
| public:
 | |
|     static ErrorOr<NonnullOwnPtr<SubsampledYUVFrame>> try_create(
 | |
|         Gfx::IntSize size,
 | |
|         u8 bit_depth, CodingIndependentCodePoints cicp,
 | |
|         bool subsampling_horizontal, bool subsampling_vertical,
 | |
|         Span<u16> plane_y, Span<u16> plane_u, Span<u16> plane_v);
 | |
| 
 | |
|     SubsampledYUVFrame(
 | |
|         Gfx::IntSize size,
 | |
|         u8 bit_depth, CodingIndependentCodePoints cicp,
 | |
|         bool subsampling_horizontal, bool subsampling_vertical,
 | |
|         FixedArray<u16>& plane_y, FixedArray<u16>& plane_u, FixedArray<u16>& plane_v)
 | |
|         : VideoFrame(size, bit_depth, cicp)
 | |
|         , m_subsampling_horizontal(subsampling_horizontal)
 | |
|         , m_subsampling_vertical(subsampling_vertical)
 | |
|         , m_plane_y(move(plane_y))
 | |
|         , m_plane_u(move(plane_u))
 | |
|         , m_plane_v(move(plane_v))
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     DecoderErrorOr<void> output_to_bitmap(Gfx::Bitmap& bitmap) override;
 | |
| 
 | |
| protected:
 | |
|     bool m_subsampling_horizontal;
 | |
|     bool m_subsampling_vertical;
 | |
|     FixedArray<u16> m_plane_y;
 | |
|     FixedArray<u16> m_plane_u;
 | |
|     FixedArray<u16> m_plane_v;
 | |
| };
 | |
| 
 | |
| }
 | 
