From 88682cecca30098ee0d15e8cde9b2bb7b7f7bf22 Mon Sep 17 00:00:00 2001 From: TheRealOrange Date: Tue, 22 Feb 2022 14:44:40 +0800 Subject: [PATCH] updated readme --- README.md | 30 +++++++++++++++++++++++++++++- imgs/unicode_block_elements.png | Bin 0 -> 6573 bytes 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 imgs/unicode_block_elements.png diff --git a/README.md b/README.md index a13179a..348d564 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # terminalvideoplayer +## Introduction + This is a cursed terminal video player. This improves on some previous designs by implementing some optimisations such as not changing the text/background colour if the next pixel is similar enough. The video player also manages to get 4 pixels (effectively) out of every character as opposed to the usual 2 pixels by using the unicode quarter block characters. Mileage may vary depending on how fast your terminal is. In my testing, I've found that [alacritty](https://github.com/alacritty/alacritty) works rather well. @@ -18,4 +20,30 @@ g++ src/main.cpp -O3 -o ./bin/tvp `pkg-config --cflags --libs opencv4` Below is a preview of how it looks: -![video playing in terminal](imgs/video.gif) \ No newline at end of file +![video playing in terminal](./imgs/video.gif) + +## how it works + +This is not a new concept. But most terminal video players I have seen use two pixels per character. The unicode character ▄ (U+2584 lower half block) as the bottom half of the pixel, which can be coloured using the ANSI code for font colour, and the background colour, as the other pixel. + +But, if you search up the unicode block characters, you see this: + +![unicode block characters table](./imgs/unicode_block_elements.png) + +Clearly there is potential here. By using the unicode quarter block characters, as well as the half blocks + +- ▘ (U+2598 quadrant upper left) +- ▝ (U+259D quadrant upper right) +- ▖ (U+2596 quadrant lower left) +- ▗ (U+2597 quadrant lower right) +- ▞ (U+259E 1uadrant upper right and lower left) +- ▄ (U+2584 lower half block) +- ▐ (U+2590 right half block) + +We have all the building blocks for effectively double the horizontal resolution! However, we are still limited to two colours per pixel. So, we pick the configuration that minimizes the maximum difference between colours which will be made the same, and then set the colour to the average colour. + +Other optimisations include + +- only changing pixels whose colour have changed a certain value +- only inputting the ANSI code for cursor move when the next pixel isnt contiguous +- only inputting the ANSI code for background colour change when the background colour differs significantly (set as a compile option) diff --git a/imgs/unicode_block_elements.png b/imgs/unicode_block_elements.png new file mode 100644 index 0000000000000000000000000000000000000000..61ee430504beddaeff2e83bc1c48e8399b66bf34 GIT binary patch literal 6573 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 literal 0 HcmV?d00001