diff --git a/AVQt/CMakeLists.txt b/AVQt/CMakeLists.txt
index 4584f5d4d87f7aa088ef2044aa14346534f7e2a7..a8e5ada609e399de9ba17409e83569ca57458bec 100644
--- a/AVQt/CMakeLists.txt
+++ b/AVQt/CMakeLists.txt
@@ -12,10 +12,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR on)
 #find_package(Qt6 COMPONENTS Core Gui Concurrent Widgets OpenGL OpenGLWidgets)
 find_package(Qt5 COMPONENTS Core Gui Concurrent Widgets OpenGL)
 
-if (WIN32)
-    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on)
-endif ()
-
 #if (${CMAKE_BUILD_TYPE} EQUAL "Release")
 #    -O3)
 #endif ()
@@ -88,95 +84,105 @@ add_library(AVQt SHARED ${SOURCES})
 add_library(AVQtStatic STATIC ${SOURCES})
 set_target_properties(AVQtStatic PROPERTIES OUTPUT_NAME AVQt_static)
 
-target_compile_options(AVQt PRIVATE
-        -std=c++20
-        -Werror=all
-        -Werror=extra
-        -Werror=pedantic
-        -Wno-float-equal
-        -ansi
-        -Werror=init-self
-        -Werror=old-style-cast
-        -Werror=overloaded-virtual
-        -Werror=uninitialized
-        -Werror=missing-declarations
-        -Werror=init-self
-        #    -Wall -Wextra
-        -Wno-error=non-virtual-dtor
-        #        -Wno-unused-result
-        #-Wpedantic
-        -Wshadow
-        -Wfatal-errors
-        -Wundef
-        -Wuninitialized
-        -Winit-self
-        -Wconversion
-        -Wfloat-equal
-        -Wstrict-aliasing
-        -Wtrigraphs
-        -Wodr # one definition rule
-        -Wzero-as-null-pointer-constant
-        -Wsizeof-array-argument
-        -Winline
-        -Wcast-qual
-        -Weffc++
-
-
-        #    -fno-common # each global variable is only declared once.
-        #    -fmerge-all-constants
-        #    -ffunction-sections
-        #    -fdata-sections
-        #    -fno-use-cxa-atexit
-        #    -fverbose-asm
-        #    -fstrict-enums
-        -Wstack-protector
-        -Wdouble-promotion
-        )
-target_compile_options(AVQtStatic PRIVATE
-        -std=c++20
-        -Werror=all
-        -Werror=extra
-        -Werror=pedantic
-        -ansi
-        -Werror=init-self
-        -Werror=old-style-cast
-        -Werror=overloaded-virtual
-        -Werror=uninitialized
-        -Werror=missing-declarations
-        -Werror=init-self
-        #    -Wall -Wextra
-        -Wno-error=non-virtual-dtor
-        #        -Wno-unused-result
-        #-Wpedantic
-        -Wshadow
-        -Wfatal-errors
-        -Wundef
-        -Wuninitialized
-        -Winit-self
-        -Wconversion
-        -Wfloat-equal
-        -Wstrict-aliasing
-        -Wtrigraphs
-        -Wodr # one definition rule
-        -Wzero-as-null-pointer-constant
-        -Wsizeof-array-argument
-        -Winline
-        -Wcast-qual
-        -Weffc++
-
-
-        #    -fno-common # each global variable is only declared once.
-        #    -fmerge-all-constants
-        #    -ffunction-sections
-        #    -fdata-sections
-        #    -fno-use-cxa-atexit
-        #    -fverbose-asm
-        #    -fstrict-enums
-        -Wstack-protector
-        -Wdouble-promotion
-        )
+if (!WIN32)
+    target_compile_options(AVQt PRIVATE
+            -std=c++20
+            -Werror=all
+            -Werror=extra
+            -Werror=pedantic
+            -Wno-float-equal
+            -ansi
+            -Werror=init-self
+            -Werror=old-style-cast
+            -Werror=overloaded-virtual
+            -Werror=uninitialized
+            -Werror=missing-declarations
+            -Werror=init-self
+            #    -Wall -Wextra
+            -Wno-error=non-virtual-dtor
+            #        -Wno-unused-result
+            #-Wpedantic
+            -Wshadow
+            -Wfatal-errors
+            -Wundef
+            -Wuninitialized
+            -Winit-self
+            -Wconversion
+            -Wfloat-equal
+            -Wstrict-aliasing
+            -Wtrigraphs
+            -Wodr # one definition rule
+            -Wzero-as-null-pointer-constant
+            -Wsizeof-array-argument
+            -Winline
+            -Wcast-qual
+            -Weffc++
+
+
+            #    -fno-common # each global variable is only declared once.
+            #    -fmerge-all-constants
+            #    -ffunction-sections
+            #    -fdata-sections
+            #    -fno-use-cxa-atexit
+            #    -fverbose-asm
+            #    -fstrict-enums
+            -Wstack-protector
+            -Wdouble-promotion
+            )
+    target_compile_options(AVQtStatic PRIVATE
+            -std=c++20
+            -Werror=all
+            -Werror=extra
+            -Werror=pedantic
+            -ansi
+            -Werror=init-self
+            -Werror=old-style-cast
+            -Werror=overloaded-virtual
+            -Werror=uninitialized
+            -Werror=missing-declarations
+            -Werror=init-self
+            #    -Wall -Wextra
+            -Wno-error=non-virtual-dtor
+            #        -Wno-unused-result
+            #-Wpedantic
+            -Wshadow
+            -Wfatal-errors
+            -Wundef
+            -Wuninitialized
+            -Winit-self
+            -Wconversion
+            -Wfloat-equal
+            -Wstrict-aliasing
+            -Wtrigraphs
+            -Wodr # one definition rule
+            -Wzero-as-null-pointer-constant
+            -Wsizeof-array-argument
+            -Winline
+            -Wcast-qual
+            -Weffc++
+
+
+            #    -fno-common # each global variable is only declared once.
+            #    -fmerge-all-constants
+            #    -ffunction-sections
+            #    -fdata-sections
+            #    -fno-use-cxa-atexit
+            #    -fverbose-asm
+            #    -fstrict-enums
+            -Wstack-protector
+            -Wdouble-promotion
+            )
+endif ()
 
 #target_link_libraries(AVQt Qt6::Core Qt6::Gui Qt6::Concurrent Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets avformat avfilter avutil avcodec avdevice swscale swresample GL openal)
 #target_link_libraries(AVQtStatic Qt6::Core Qt6::Gui Qt6::Concurrent Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets avformat avfilter avutil avcodec avdevice swscale swresample GL openal)
-target_link_libraries(AVQt Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample GL openal)
-target_link_libraries(AVQtStatic Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample GL openal)
\ No newline at end of file
+target_link_libraries(AVQt Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample)
+target_link_libraries(AVQtStatic Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample)
+
+if (WIN32)
+    target_link_libraries(AVQt opengl32 OpenAL32)
+    target_link_libraries(AVQtStatic opengl32 OpenAL32)
+else ()
+    target_link_libraries(AVQt GL openal)
+    target_link_libraries(AVQtStatic GL openal)
+endif ()
\ No newline at end of file
diff --git a/AVQt/input/Demuxer.cpp b/AVQt/input/Demuxer.cpp
index d99e134901427e16e18385b13a8bdb749967497e..fe24e6fe396b7a8038b3aa6b01b432fc4bacb8dc 100644
--- a/AVQt/input/Demuxer.cpp
+++ b/AVQt/input/Demuxer.cpp
@@ -102,7 +102,7 @@ namespace AVQt {
         bool initialized = true;
         d->m_initialized.compare_exchange_strong(initialized, true);
         if (!initialized) {
-            d->m_pBuffer = new uint8_t[DemuxerPrivate::BUFFER_SIZE];
+            d->m_pBuffer = static_cast<uint8_t *>(av_malloc(DemuxerPrivate::BUFFER_SIZE));
             d->m_pIOCtx = avio_alloc_context(d->m_pBuffer, DemuxerPrivate::BUFFER_SIZE, 0, d->m_inputDevice,
                                              &DemuxerPrivate::readFromIO, nullptr, &DemuxerPrivate::seekIO);
             d->m_pFormatCtx = avformat_alloc_context();
diff --git a/AVQt/input/private/Demuxer_p.h b/AVQt/input/private/Demuxer_p.h
index aa6cc518b355539e34baecb91b801520db1bc449..1ba35b36645ceaa09a54a9085624ff7a58bb161b 100644
--- a/AVQt/input/private/Demuxer_p.h
+++ b/AVQt/input/private/Demuxer_p.h
@@ -37,7 +37,7 @@ namespace AVQt {
         QList<int64_t> m_videoStreams{}, m_audioStreams{}, m_subtitleStreams{};
         int64_t m_videoStream{-1}, m_audioStream{-1}, m_subtitleStream{-1};
 
-        static constexpr size_t BUFFER_SIZE{1024};
+        static constexpr size_t BUFFER_SIZE{32 * 1024};
         uint8_t *m_pBuffer{nullptr};
         AVFormatContext *m_pFormatCtx{nullptr};
         AVIOContext *m_pIOCtx{nullptr};
diff --git a/AVQt/output/Muxer.cpp b/AVQt/output/Muxer.cpp
index 2e83823f7b07887bd37c73c6e66ff788f8c3be6e..6f6788730b8b9ed4a43c5dff6f7a5ce48ec9fa53 100644
--- a/AVQt/output/Muxer.cpp
+++ b/AVQt/output/Muxer.cpp
@@ -1,8 +1,6 @@
 //
 // Created by silas on 5/24/21.
 //
-
-#include <experimental/algorithm>
 #include <input/IPacketSource.h>
 #include "private/Muxer_p.h"
 #include "Muxer.h"
diff --git a/AVQt/output/OpenGLRenderer.cpp b/AVQt/output/OpenGLRenderer.cpp
index 8ce839be0e36325e412df022e94d4ed8f2a58982..d78699bc6edecea2909780f3839ffd8c735ef741 100644
--- a/AVQt/output/OpenGLRenderer.cpp
+++ b/AVQt/output/OpenGLRenderer.cpp
@@ -64,10 +64,10 @@ namespace AVQt {
             d->m_paused.store(false);
             qDebug("Started renderer");
 
-            showNormal();
-            requestActivate();
+            QMetaObject::invokeMethod(this, "showNormal", Qt::QueuedConnection);
+            QMetaObject::invokeMethod(this, "requestActivate", Qt::QueuedConnection);
+            QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
 
-            update();
             started();
         }
         return 0;
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9a4414e8199c6c64be30ee0a20db1450da0d4bd2..e429a53e2a7ad9113ebb3c11859b72f8a4802fe5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,10 +3,19 @@ project(LibAVQt)
 
 set(CMAKE_CXX_STANDARD 20)
 
+if (WIN32)
+    include_directories(${OPENAL_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIR})
+    link_directories(${OPENAL_LIBRARY} ${FFMPEG_LIBRARY})
+    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on)
+endif ()
+
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+
 set(CMAKE_AUTOMOC on)
 set(CMAKE_AUTORCC on)
 set(CMAKE_AUTOUIC on)
 
 add_subdirectory(AVQt)
 include_directories(AVQt)
-add_subdirectory(Player)
+add_subdirectory(Player)
\ No newline at end of file
diff --git a/Player/main.cpp b/Player/main.cpp
index a4623d4f5d22aafbcbdd9d0cc7a7ee9e43f33367..83656d8347d3ce3f95d26da4e4d02202162c9c3c 100644
--- a/Player/main.cpp
+++ b/Player/main.cpp
@@ -43,6 +43,9 @@ int main(int argc, char *argv[]) {
     app = new QApplication(argc, argv);
     signal(SIGINT, &signalHandler);
     signal(SIGTERM, &signalHandler);
+
+    av_log_set_level(AV_LOG_DEBUG);
+    av_log_set_flags(AV_LOG_SKIP_REPEATED);
 //    signal(SIGQUIT, &signalHandler);
 
     start = std::chrono::system_clock::now();
@@ -57,7 +60,7 @@ int main(int argc, char *argv[]) {
         return 0;
     }
 
-    inputFile->open(QIODevice::ReadOnly);
+    inputFile->open(QIODevice::ReadWrite);
 
     AVQt::Demuxer demuxer(inputFile);
 //    AVQt::AudioDecoder decoder;
@@ -67,8 +70,10 @@ int main(int argc, char *argv[]) {
 //    decoder.registerCallback(&output);
 
     AVQt::IDecoder *videoDecoder;
+    AVQt::IEncoder *videoEncoder;
 #ifdef Q_OS_LINUX
     videoDecoder = new AVQt::DecoderVAAPI;
+    videoEncoder = new AVQt::EncoderVAAPI("hevc_vaapi");
 #elif defined(Q_OS_WINDOWS)
     videoDecoder = new AVQt::DecoderDXVA2();
 #else
@@ -76,17 +81,15 @@ int main(int argc, char *argv[]) {
 #endif
     AVQt::OpenGLRenderer renderer;
 
-    AVQt::IEncoder *encoder = new AVQt::EncoderVAAPI("hevc_vaapi");
-
     demuxer.registerCallback(videoDecoder, AVQt::IPacketSource::CB_VIDEO);
-    videoDecoder->registerCallback(encoder);
+//    videoDecoder->registerCallback(videoEncoder);
 
-    QFile outputFile("output.mp4");
-    outputFile.open(QIODevice::ReadWrite | QIODevice::Truncate);
-    outputFile.seek(0);
-    AVQt::Muxer muxer(&outputFile);
+//    QFile outputFile("output.mp4");
+//    outputFile.open(QIODevice::ReadWrite | QIODevice::Truncate);
+//    outputFile.seek(0);
+//    AVQt::Muxer muxer(&outputFile);
 
-    encoder->registerCallback(&muxer, AVQt::IPacketSource::CB_VIDEO);
+//    videoEncoder->registerCallback(&muxer, AVQt::IPacketSource::CB_VIDEO);
     videoDecoder->registerCallback(&renderer);
 
     renderer.setMinimumSize(QSize(360, 240));
@@ -106,7 +109,7 @@ int main(int argc, char *argv[]) {
 
     QObject::connect(app, &QApplication::aboutToQuit, [&] {
         demuxer.deinit();
-        delete encoder;
+//        delete videoEncoder;
         delete videoDecoder;
     });