From 7b3b2cfd0bd13d6625d82915687eefc4870a410a Mon Sep 17 00:00:00 2001 From: Harshit-Dhanwalkar Date: Fri, 15 May 2026 01:27:35 +0530 Subject: [PATCH] Update README and organise file structure --- Makefile => C/Makefile | 0 {include => C/include}/ascii.h | 0 {include => C/include}/capture.h | 0 {include => C/include}/timing.h | 0 {src => C/src}/ascii.c | 12 +++++++----- {src => C/src}/capture.c | 0 {src => C/src}/main.c | 0 {src => C/src}/timing.c | 0 Cpp/README.md | 3 +++ README.md | 6 ++++++ webcam_ascii | Bin 21760 -> 0 bytes 11 files changed, 16 insertions(+), 5 deletions(-) rename Makefile => C/Makefile (100%) rename {include => C/include}/ascii.h (100%) rename {include => C/include}/capture.h (100%) rename {include => C/include}/timing.h (100%) rename {src => C/src}/ascii.c (88%) rename {src => C/src}/capture.c (100%) rename {src => C/src}/main.c (100%) rename {src => C/src}/timing.c (100%) create mode 100644 Cpp/README.md delete mode 100755 webcam_ascii diff --git a/Makefile b/C/Makefile similarity index 100% rename from Makefile rename to C/Makefile diff --git a/include/ascii.h b/C/include/ascii.h similarity index 100% rename from include/ascii.h rename to C/include/ascii.h diff --git a/include/capture.h b/C/include/capture.h similarity index 100% rename from include/capture.h rename to C/include/capture.h diff --git a/include/timing.h b/C/include/timing.h similarity index 100% rename from include/timing.h rename to C/include/timing.h diff --git a/src/ascii.c b/C/src/ascii.c similarity index 88% rename from src/ascii.c rename to C/src/ascii.c index ae47652..6f0394b 100644 --- a/src/ascii.c +++ b/C/src/ascii.c @@ -3,11 +3,13 @@ #include #include -void yuyv_to_gray(const uint8_t *yuyv, uint8_t *gray, int width, int height) { - for (int i = 0, j = 0; i < width * height * 2; i += 2, j++) { - gray[j] = yuyv[i]; - } -} +#define CHECK(x, msg) if ((x) < 0) { perror(msg); goto cleanup; } + +typedef struct { + uint8_t *raw_frame; + uint8_t *gray; + char *ascii; +} frame_t; char *grayscale_to_ascii(const uint8_t *gray, int src_w, int src_h, int dst_w, int dst_h) { diff --git a/src/capture.c b/C/src/capture.c similarity index 100% rename from src/capture.c rename to C/src/capture.c diff --git a/src/main.c b/C/src/main.c similarity index 100% rename from src/main.c rename to C/src/main.c diff --git a/src/timing.c b/C/src/timing.c similarity index 100% rename from src/timing.c rename to C/src/timing.c diff --git a/Cpp/README.md b/Cpp/README.md new file mode 100644 index 0000000..c857fe6 --- /dev/null +++ b/Cpp/README.md @@ -0,0 +1,3 @@ +# TODO + +First focusing on implementing in C then Cpp. diff --git a/README.md b/README.md index c21623f..4687553 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,10 @@ Ascii video output from your webcam in your terminal. ## TODO - [x] Adjust width and height of capturing frame. +- [ ] Brightness/contrast adjustment. +- [ ] Custom ASCII charset via config file +- [ ] Reverse video - Invert brightness $\rightarrow$ charset mapping +- [ ] Color output - Extract U/V channels, map to ANSI/RGB codes - [ ] Add feature to record and save it in popular video formats like `.mp4`, `.mov` and `.gif`. +- [ ] Dithering +- [ ] Migrate from C to Cpp. diff --git a/webcam_ascii b/webcam_ascii deleted file mode 100755 index ca56ee70d66f12d42502db86b0e02f26a78051fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21760 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