Build a Mac app, full code and instruction to build the project
Follow the best practice of object orientated programming

Project Outline: MetalFX Video Player with Real-Time Upscaling

Objective:

Develop a macOS video player application that utilizes Apple’s Metal framework, specifically the MetalFX upscaling technology, to upscale low-resolution video content in real-time. The goal is to improve video quality for users viewing on high-resolution displays.

Features:

	1.	Basic Video Playback:
	•	User can load and play video files in various formats (e.g., MP4, MOV).
	•	Standard playback controls: play, pause, stop, seek, and volume control.
	2.	Real-Time Video Upscaling:
	•	Real-time upscaling of video content using MetalFX’s default 10 Pro anti-aliasing method.
	•	Display the upscaled video on screens with higher resolutions (e.g., Retina displays).
	3.	User Input/Interaction:
	•	File Input: User selects a video file from the local file system.
	•	Playback Settings: Basic controls like play/pause, resolution display settings, and a toggle for enabling/disabling MetalFX upscaling.
	4.	Settings Interface:
	•	Allow users to toggle between original resolution and upscaled resolution.
	•	Include performance metrics display, toggled by a button among the play pause button groups.

User Inputs:

	1.	Video File Selection:
	•	The user will select a video file from the file picker or drag-and-drop a video onto the app interface.
	2.	Playback Control:
	•	Standard video controls (play, pause, stop).
	•	Seek bar to navigate through the video.
	•	A toggle MetalFX upscaling off, on (Full HD) and on (4K),  toggled by a segmented button among the play pause button groups

Workflow:

	1.	Video Loading & Decoding:
	•	AVFoundation handles loading and decoding the selected video file.
	•	Each frame is passed from AVFoundation to Metal for further processing.
	2.	Frame Upscaling with MetalFX:
	•	The decoded frame (lower resolution) is sent to Metal for real-time upscaling using MetalFX 10 Pro anti-aliasing.
	•	Metal will create a texture from the decoded video frame, then upscale this texture.
	•	The MetalFX 10 Pro anti-aliasing shader will apply temporal anti-aliasing and edge enhancement to produce a higher-resolution frame.
	3.	Rendering:
	•	The upscaled frame is rendered to a Metal texture that is then displayed on the screen.
	•	Synchronize with the display’s refresh rate for smooth playback.
	4.	Output Display:
	•	The upscaled video is displayed in the app’s main window.
	•	If MetalFX is disabled, the app will display the original decoded video frame without upscaling.
	5.	Performance Metrics:
	•	A setting can display performance statistics like frame rate and resource usage during playback to gauge the upscaling efficiency.

Detailed Metal Integration:

	•	Metal Device Initialization:
	•	Set up a MTLDevice, MTLCommandQueue, and MTLRenderPipelineState.
	•	Upscaling via MetalFX:
	•	Use Apple’s built-in MetalFX 10 Pro anti-aliasing shader as part of the pipeline.
	•	Each frame, after being decoded by AVFoundation, is passed as a texture to Metal.
	•	MetalFX will process the texture, applying temporal anti-aliasing, edge smoothing, and upscaling to match the desired resolution.
	•	Command Buffer Execution:
	•	A MTLCommandBuffer is used to process each frame.
	•	MetalFX’s anti-aliasing upscaling method is applied, and the final upscaled frame is rendered back into a drawable texture.
	•	Synchronization:
	•	Ensure that the command buffer is synchronized with the display’s refresh rate for seamless video playback.