From 8295e4948567cbe4f7854bb35adf3fd1d010a178 Mon Sep 17 00:00:00 2001 From: TheRealOrange Date: Fri, 25 Feb 2022 18:15:01 +0800 Subject: [PATCH] added comments to the code --- inc/video.h | 1 + src/main.cpp | 240 ++++++++++++++++++++++++++++++++++---------------- src/video.cpp | 9 +- tvp | Bin 43552 -> 46640 bytes 4 files changed, 172 insertions(+), 78 deletions(-) diff --git a/inc/video.h b/inc/video.h index 707c911..5bc591c 100644 --- a/inc/video.h +++ b/inc/video.h @@ -26,6 +26,7 @@ public: [[nodiscard]] int get_width() const; [[nodiscard]] int get_height() const; [[nodiscard]] int get_dst_buf_size() const; + [[nodiscard]] bool is_end_of_stream() const; int get_frame(int dst_w, int dst_h, const char* dst_frame); private: diff --git a/src/main.cpp b/src/main.cpp index d65dfca..75c5854 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,49 +28,49 @@ const char characters[DIFF_CASES][4] = {"\u2584", // bottom half block "\u258a"}; const int pixelmap[DIFF_CASES][CHAR_Y * CHAR_X] = {{0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1, - 1, 1, 1, 1}, + 0, 0, 0, 0, + 1, 1, 1, 1, + 1, 1, 1, 1}, {0, 0, 1, 1, - 0, 0, 1, 1, - 0, 0, 1, 1, - 0, 0, 1, 1}, + 0, 0, 1, 1, + 0, 0, 1, 1, + 0, 0, 1, 1}, {1, 1, 0, 0, - 1, 1, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0}, + 1, 1, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0}, {0, 0, 1, 1, - 0, 0, 1, 1, - 0, 0, 0, 0, - 0, 0, 0, 0}, + 0, 0, 1, 1, + 0, 0, 0, 0, + 0, 0, 0, 0}, {0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 0, 0, - 1, 1, 0, 0}, + 0, 0, 0, 0, + 1, 1, 0, 0, + 1, 1, 0, 0}, {0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 0, 1, 1}, + 0, 0, 0, 0, + 0, 0, 1, 1, + 0, 0, 1, 1}, {0, 0, 1, 1, - 0, 0, 1, 1, - 1, 1, 0, 0, - 1, 1, 0, 0}, + 0, 0, 1, 1, + 1, 1, 0, 0, + 1, 1, 0, 0}, {0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1}, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1}, {0, 0, 0, 0, - 1, 1, 1, 1, - 1, 1, 1, 1, - 1, 1, 1, 1}, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1}, {1, 0, 0, 0, - 1, 0, 0, 0, - 1, 0, 0, 0, - 1, 0, 0, 0}, + 1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0}, {1, 1, 1, 0, - 1, 1, 1, 0, - 1, 1, 1, 0, - 1, 1, 1, 0}}; + 1, 1, 1, 0, + 1, 1, 1, 0, + 1, 1, 1, 0}}; #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN @@ -116,22 +116,6 @@ void get_terminal_size(int &width, int &height) { #endif } -int w = -1, h = -1; -int im_w, im_h; -double scale_factor = 0.0; -int small_dims[2]; - -char *frame; -char *old; -bool alloc = false; - -int diff = 0; -int pixel[CHAR_Y][CHAR_X][3]; -bool refresh = false; -bool begin = true; - -int r, c; - char printbuf[50000000]; const char *shapechar; int count = 0, curr_frame = 0;; @@ -151,22 +135,11 @@ long long total_printing_time = 0; int diffthreshold = 10; -int curr_w, curr_h, orig_w = -1, orig_h = -1; - -int mindiff, diffbg, diffpixel; -int min_fg, min_bg, max_fg, max_bg; -int cases[DIFF_CASES]; -int case_min = 0; - -bool bgsame = false, pixelsame = false; - -int prevpixelbg[3] = {1000, 1000, 1000}; -int pixelbg[3], pixelchar[3]; -int prevpixel[3] = {1000, 1000, 1000}; - -int sx = 4, sy = 8; +int sx = CHAR_X, sy = CHAR_X*2; int skipy = sy / CHAR_Y, skipx = sx / CHAR_X; +// function to intercept SIGINT such that we print the ANSI code to restore the cursor visibility +// and also print some statistics about the video played void terminateProgram([[maybe_unused]] int sig_num) { videostop = std::chrono::steady_clock::now(); long long total_video_time = (long long) std::chrono::duration_cast( @@ -179,60 +152,119 @@ void terminateProgram([[maybe_unused]] int sig_num) { } int main(int argc, char *argv[]) { + // initialise time reference so its valid in the SIGINT handler videostart = std::chrono::steady_clock::now(); + + // bind the function to the SIGINT signal signal(SIGINT, terminateProgram); + + // set a custom size printbuf, and also set buffering to line only so we can control when the + // buffer will be flushed setvbuf(stdout, printbuf, _IOLBF, sizeof(printbuf)); - // Create a VideoCapture object and open the input file - // If the input is the web camera, pass 0 instead of the video file name + + // check if number of arguments is correct if (argc <= 1 || strlen(argv[1]) <= 0) { printf("\u001b[0mplease provide the filename as the first input argument"); fflush(stdout); return 0; } +// apparently macos uses std::__fs::filesystem #if defined(__APPLE__) if (std::__fs::filesystem::exists(argv[1])) { #else if (std::filesystem::exists(argv[1])) { #endif + // if the diff threshold argument is specified, and is within range, use the specified diff if (argc > 2) diffthreshold = std::stoi(argv[2], nullptr, 10); diffthreshold = std::max(std::min(255, diffthreshold), 0); + + // open the video file and create the decode object video cap(argv[1]); - // Check if camera opened successfully + + // check if successfully opened if (!cap.isOpened()) { printf("\u001b[0mError opening video stream or file\n"); fflush(stdout); return -1; } + // get video FPS and compute period of each frame fps = cap.get_fps(); period = (int) (1000000.0 / fps); + + // initialise the time reference for the frame time counter start = std::chrono::steady_clock::now(); + + // variables used for scaling to terminal size + int w = -1, h = -1; + int curr_w, curr_h, orig_w = -1, orig_h = -1; + int im_w, im_h; + double scale_factor = 0.0; + int small_dims[2]; + + // variables used for handling the image data + char *frame; + char *old; + bool alloc = false; + + // variables used for pixel update + int diff = 0; + int pixel[CHAR_Y][CHAR_X][3]; + bool refresh = false; + bool begin = true; + + // variables used to see if ansi colour command needs to be reprinted + bool bgsame = false, pixelsame = false; + + int prevpixelbg[3] = {1000, 1000, 1000}; + int pixelbg[3], pixelchar[3]; + int prevpixel[3] = {1000, 1000, 1000}; + + // variables used to keep track of cursor location + int r, c; + + // variables used to select the pixel type to print + int mindiff, diffbg, diffpixel; + int min_fg, min_bg, max_fg, max_bg; + int cases[DIFF_CASES]; + int case_min = 0; + while (true) { - count++; - curr_frame++; + count++; // count the actual number of frames printed + curr_frame++; // count the current frame we are on get_terminal_size(curr_w, curr_h); + + // if the terminal size has changed, recompute scaling if (curr_w != orig_w || curr_h != orig_h) { orig_w = curr_w; orig_h = curr_h; w = curr_w; h = curr_h; - h -= 1; + h -= 1; // leave one line for the fps and other info to be printed msg_y = h; h *= sy; w *= sx; im_w = cap.get_width(); im_h = cap.get_height(); + + // get the scaling to fit the smallest dim scale_factor = std::min((double) w / (double) im_w, (double) h / (double) im_h); small_dims[0] = int((double) im_w * scale_factor); small_dims[1] = int((double) im_h * scale_factor); - if (small_dims[0] == 0 || small_dims[1] == 0) { + + // if the terminal size is invalid + if (small_dims[0] <= 0 || small_dims[1] <= 0) { printf("\u001b[%d;%dHterminal dimensions is too small! (%d, %d) \n", msg_y, 0, curr_w, curr_h); fflush(stdout); exit(0); } + + // force all pixels to update in the next frame refresh = true; + + // if this is the beginning, print some video statistics if (begin) { begin = false; printf("\u001b[?25l"); @@ -242,32 +274,46 @@ int main(int argc, char *argv[]) { printf("scaling: %f\n", scale_factor); printf("frames per second: %f\n", fps); fflush(stdout); + + // wait one second so the info can be read std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + + // set actual reference times start = std::chrono::steady_clock::now(); videostart = std::chrono::steady_clock::now(); } + + // free up old frame data if they were allocated if (alloc) { std::free(frame); std::free(old); } + + // set the video resize dimensions cap.setResize(small_dims[0], small_dims[1]); + + // create new frame data buffers frame = (char *) std::malloc(cap.get_dst_buf_size()); old = (char *) std::malloc(cap.get_dst_buf_size()); alloc = true; memset(old, 0, sizeof(*old)); + // set the entire screen to black printf("\u001b[0;0H\u001b[48;2;0;0;0m"); for (int i = 0; i < curr_w * curr_h; i++) printf(" "); } + // get frame from video int ret = cap.get_frame(small_dims[0], small_dims[1], frame); + // compute time taken for the previous frame stop = std::chrono::steady_clock::now(); elapsed = (int) std::chrono::duration_cast(stop - videostart).count(); int frame_time = (int) std::chrono::duration_cast(stop - start).count(); start = std::chrono::steady_clock::now(); + // compute the average fps, as well as the fps of the last 10 frames total_time = elapsed; avg_fps = (double) count * 1000000.0 / (double) total_time; frametimes.push(frame_time); @@ -277,11 +323,13 @@ int main(int argc, char *argv[]) { frametimes.pop(); } + // if there is still time before the next frame, wait a bit if (curr_frame * period - elapsed > 0) std::this_thread::sleep_until( std::chrono::microseconds(curr_frame * period - elapsed - frame10_time / frametimes.size()) + stop); else { + // if the next frame is overdue, skip the frame and wait till the earliest non-overdue frame skip = (double) elapsed / (double) period - (double) curr_frame; for (int i = 0; i < std::floor(skip); i++) ret = cap.get_frame(small_dims[0], small_dims[1], frame); dropped += std::floor(skip); @@ -290,9 +338,13 @@ int main(int argc, char *argv[]) { std::chrono::microseconds(curr_frame * period - frame10_time / frametimes.size()) + videostart); } + // print the fps, avg fps, dropped frames, etc. at the bottom of the video printf("\u001b[%d;%dH\u001b[48;2;0;0;0;38;2;255;255;255m fps: %5.2f | avg_fps: %5.2f | print: %6.2fms | dropped: %5d | curr_frame: %5d ", msg_y, 0, (double) frametimes.size() * 1000000.0 / frame10_time, avg_fps, (double) printing_time / 1000.0, dropped, curr_frame); + + // set the previous pixel bg colour and font colour to a large value to force the ansi colour command to be printed + // for the first pixel in each frame prevpixelbg[0] = 1000; prevpixelbg[1] = 1000; prevpixelbg[2] = 1000; @@ -300,31 +352,43 @@ int main(int argc, char *argv[]) { prevpixel[1] = 1000; prevpixel[2] = 1000; - // If the frame is empty, break immediately + // if the video is over, break + if (cap.is_end_of_stream()) break; + // if the frame is empty, break immediately if (ret < 0) { printf("\u001b[0mError reading video stream or file\n"); break; } + // force the first pixel to use the ansi cursor move command r = -1; c = -1; + + // variables to store the pointer to the start of each row for easier reference + // each pixel uses CHAR_Y rows of the actual image char *row[CHAR_Y]; char *oldrow[CHAR_Y]; + for (int ay = 0; ay < cap.get_height() / sy; ay++) { + // set the row pointers + for (int i = 0; i < CHAR_Y; i++) { + row[i] = frame + (ay * sy + i * skipy) * 3 * cap.get_width(); + oldrow[i] = old + (ay * sy + i * skipy) * 3 * cap.get_width(); + } for (int x = 0; x < cap.get_width() / sx; x++) { - for (int i = 0; i < CHAR_Y; i++) { - row[i] = frame + (ay * sy + i * skipy) * 3 * cap.get_width(); - oldrow[i] = old + (ay * sy + i * skipy) * 3 * cap.get_width(); - } + // get the colour values of the pixels of the current character for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) for (int k = 0; k < 3; k++) pixel[i][j][k] = (unsigned char) (*(row[i] + (x * sx + j * skipx) * 3 + k)); diff = 0; + // if a refresh is necessary, set the diff to the max diff if (refresh) { diff = 255; } else { + // otherwise, find the max difference in RGB values between the actual + // video frame and what is on screen for each pixel that makes up the character for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) for (int k = 0; k < 3; k++) @@ -333,15 +397,22 @@ int main(int argc, char *argv[]) { pixel[i][j][k])); } + // if the difference exceeds the set threshold, reprint the entire character if (diff >= diffthreshold) { for (int &case_it: cases) case_it = 0; + // calculate for each unicode character, the max error between what + // will be printed on screen and the actual video pixel if the character were used for (int k = 0; k < 3; k++) { for (int case_it = 0; case_it < sizeof(cases) / sizeof(cases[0]); case_it++) { min_fg = 256; min_bg = 256; max_fg = 0; max_bg = 0; + // for every character, there is a foreground colour and background colour + // so we just check for the max and the min of all the values for pixels which + // belong to the foreground and background regions respectively + // the diff between the max and the min is the max error for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) { if (pixelmap[case_it][i * CHAR_X + j]) { @@ -356,6 +427,7 @@ int main(int argc, char *argv[]) { } } + // choose the unicode char to print which minimises the diff mindiff = 256; case_min = 0; for (int case_it = 0; case_it < sizeof(cases) / sizeof(cases[0]); case_it++) { @@ -371,6 +443,9 @@ int main(int argc, char *argv[]) { bgsame = false; pixelsame = false; + // based on the unicode character selected, find the avg colour of the pixels + // in the foreground region and background region + // the avg colour will be used as the colour to be printed for (int k = 0; k < 3; k++) { int bg_count = 0, fg_count = 0; pixelchar[k] = 0; @@ -387,10 +462,19 @@ int main(int argc, char *argv[]) { } pixelchar[k] /= fg_count; pixelbg[k] /= bg_count; + + // find the max diff between the foreground and background colours + // of the previously printed character diffbg = std::max(diffbg, std::abs(pixelbg[k] - prevpixelbg[k])); diffpixel = std::max(diffpixel, std::abs(pixelchar[k] - prevpixel[k])); } + // if the foreground or background colours are sufficiently similar, + // we don't need to print the ansi command again + + // but if we skip printing the ansi command to change colour, + // we have to remember to keep track of the actual colour of this character + // on screen, which will be the colour of previous one if (diffbg < CHANGE_THRESHOLD) { for (int k = 0; k < 3; k++) pixelbg[k] = prevpixelbg[k]; bgsame = true; @@ -402,6 +486,7 @@ int main(int argc, char *argv[]) { } else for (int k = 0; k < 3; k++) prevpixel[k] = pixelchar[k]; + // store the actual colour of the character's pixels in a buffer to check diff next time for (int k = 0; k < 3; k++) for (int i = 0; i < CHAR_Y; i++) for (int j = 0; j < CHAR_X; j++) { @@ -411,10 +496,13 @@ int main(int argc, char *argv[]) { *(oldrow[i] + (x * sx + j * skipx) * 3 + k) = (char) pixelbg[k]; } + // if the cursor is already in the right position, do not print the ansi move cursor command if (r != ay || c != x) { printf("\u001b[%d;%dH", ay, x); } + // prints background and foreground colour change command, or either of them, or none + // depending on the previously computed difference if (!bgsame && !pixelsame) printf("\u001b[48;2;%d;%d;%d;38;2;%d;%d;%dm%s", pixelbg[2], pixelbg[1], pixelbg[0], pixelchar[2], pixelchar[1], pixelchar[0], shapechar); @@ -425,6 +513,7 @@ int main(int argc, char *argv[]) { else printf("%s", shapechar); + // advance the cursor to keep track of where it is r = ay; c = x + 1; if (c == curr_w) { @@ -437,6 +526,7 @@ int main(int argc, char *argv[]) { } refresh = false; printtime = std::chrono::steady_clock::now(); + // flush the print buffer fflush(stdout); printing_time = (int) std::chrono::duration_cast( diff --git a/src/video.cpp b/src/video.cpp index 9a6981a..c4d8acd 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -113,9 +113,9 @@ int video::get_frame(int dst_w, int dst_h, const char* dst_frame) { if (end_of_stream_enc) return -1; sws_scale(swsctx, decframe->data, decframe->linesize, 0, decframe->height, frame->data, frame->linesize); - //char *it = (char *)dst_frame; + av_image_copy_to_buffer((uint8_t *) dst_frame, get_dst_buf_size(), frame->data, frame->linesize, dst_pix_fmt, dst_width, dst_height, 1); - //printf("copy %p\n", dst_frame); + return 0; } @@ -135,7 +135,6 @@ void video::setResize(int w, int h) { if (alloc) av_freep(&frame->data[0]); av_image_alloc(frame->data, frame->linesize, dst_width, dst_height, dst_pix_fmt, 16); - printf("after av alloc %p\n", frame->data); alloc = true; } @@ -149,3 +148,7 @@ video::~video() { int video::get_dst_buf_size() const { return dst_height*dst_width*3+50; } + +bool video::is_end_of_stream() const { + return end_of_stream_enc; +} diff --git a/tvp b/tvp index c802a40c83d098a3ff27fdd0a635973e3c012068..13ba7c0a074a1fd58d11af44e43a8735d4008917 100755 GIT binary patch literal 46640 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 literal 43552 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 byo3%Y%ay#OekA$nKjj?sO$6hSfGYnJlZhEs