From 73ed97993f6c4b240807735fe655fa0ed332e7d5 Mon Sep 17 00:00:00 2001 From: nick black Date: Sat, 5 Jun 2021 20:31:46 -0400 Subject: [PATCH] kill 'none' multimedia implementation #1718 --- src/lib/visual.c | 77 ++++++++++++++++++++------------- src/media/none.cpp | 105 +-------------------------------------------- 2 files changed, 48 insertions(+), 134 deletions(-) diff --git a/src/lib/visual.c b/src/lib/visual.c index ae3b732b6..07d90d3f1 100644 --- a/src/lib/visual.c +++ b/src/lib/visual.c @@ -4,8 +4,21 @@ #include "visual-details.h" #include "internal.h" +// ncvisual core code has a basic implementation in libnotcurses-core, and can +// be augmented with a "multimedia engine" -- currently FFmpeg or OpenImageIO, +// or the trivial "none" engine. all libnotcurses (built against one of these +// engines, selected at compile time) actually does is set this +// visual_implementation pointer, and then call libnotcurses_core_init(). the +// "none" implementation exists to facilitate linking programs written against +// libnotcurses in environments without a true multimedia engine, and does not +// set this pointer. all this machination exists to support building notcurses +// (and running notcurses programs) without the need of heavy media engines. + const ncvisual_implementation* visual_implementation = NULL; +// you need an actual multimedia implementation for functions which work with +// codecs, including ncvisual_decode(), ncvisual_decode_loop(), +// ncvisual_from_file(), ncvisual_stream(), and ncvisual_subtitle(). int ncvisual_decode(ncvisual* nc){ if(!visual_implementation){ return -1; @@ -13,6 +26,36 @@ int ncvisual_decode(ncvisual* nc){ return visual_implementation->visual_decode(nc); } +int ncvisual_decode_loop(ncvisual* nc){ + if(!visual_implementation){ + return -1; + } + return visual_implementation->visual_decode_loop(nc); +} + +ncvisual* ncvisual_from_file(const char* filename){ + if(!visual_implementation){ + return NULL; + } + return visual_implementation->visual_from_file(filename); +} + +int ncvisual_stream(notcurses* nc, ncvisual* ncv, float timescale, + ncstreamcb streamer, const struct ncvisual_options* vopts, + void* curry){ + if(!visual_implementation){ + return -1; + } + return visual_implementation->visual_stream(nc, ncv, timescale, streamer, vopts, curry); +} + +char* ncvisual_subtitle(const ncvisual* ncv){ + if(!visual_implementation){ + return NULL; + } + return visual_implementation->visual_subtitle(ncv); +} + int ncvisual_blit(ncvisual* ncv, int rows, int cols, ncplane* n, const struct blitset* bset, const blitterargs* barg){ int ret = -1; @@ -37,6 +80,7 @@ void ncvisual_details_seed(struct ncvisual* ncv){ } } +// to be called at startup -- performs any necessary engine initialization. int ncvisual_init(int loglevel){ if(visual_implementation){ return visual_implementation->visual_init(loglevel); @@ -44,13 +88,6 @@ int ncvisual_init(int loglevel){ return 0; } -ncvisual* ncvisual_from_file(const char* filename){ - if(!visual_implementation){ - return NULL; - } - return visual_implementation->visual_from_file(filename); -} - ncvisual* ncvisual_create(void){ if(visual_implementation){ return visual_implementation->visual_create(); @@ -63,6 +100,9 @@ ncvisual* ncvisual_create(void){ void ncvisual_printbanner(const notcurses* nc){ if(visual_implementation){ visual_implementation->visual_printbanner(nc); + }else{ + term_fg_palindex(nc, stderr, nc->tcache.colors <= 88 ? 1 % nc->tcache.colors : 0xcb); + fprintf(stderr, "\n Warning! Notcurses was built without multimedia support.\n"); } } @@ -1061,29 +1101,6 @@ bool notcurses_canopen_videos(const notcurses* nc __attribute__ ((unused))){ return visual_implementation->canopen_videos; } -int ncvisual_decode_loop(ncvisual* nc){ - if(!visual_implementation){ - return -1; - } - return visual_implementation->visual_decode_loop(nc); -} - -int ncvisual_stream(notcurses* nc, ncvisual* ncv, float timescale, - ncstreamcb streamer, const struct ncvisual_options* vopts, - void* curry){ - if(!visual_implementation){ - return -1; - } - return visual_implementation->visual_stream(nc, ncv, timescale, streamer, vopts, curry); -} - -char* ncvisual_subtitle(const ncvisual* ncv){ - if(!visual_implementation){ - return NULL; - } - return visual_implementation->visual_subtitle(ncv); -} - int ncvisual_inflate(ncvisual* n, int scale){ if(scale <= 0){ return -1; diff --git a/src/media/none.cpp b/src/media/none.cpp index c071bf816..1a2c46862 100644 --- a/src/media/none.cpp +++ b/src/media/none.cpp @@ -4,110 +4,7 @@ #include "internal.h" #include "visual-details.h" -ncvisual* none_create(){ - return new ncvisual{}; -} - -void none_destroy(ncvisual* ncv){ - if(ncv->owndata){ - free(ncv->data); - } - delete ncv; -} - -int none_decode(ncvisual* nc){ - (void)nc; - return -1; -} - -ncvisual* none_from_file(const char* filename){ - (void)filename; - return NULL; -} - -int none_decode_loop(ncvisual* ncv){ - (void)ncv; - return -1; -} - -// resize, converting to RGBA (if necessary) along the way -int none_resize(ncvisual* nc, int rows, int cols){ - // we'd need to verify that it's RGBA as well, except that if we've got no - // multimedia engine, we've only got memory-assembled ncvisuals, which are - // RGBA-native. so we ought be good, but this is undeniably sloppy... - if(nc->pixy == rows && nc->pixx == cols){ - return 0; - } - size_t dstride = cols * 4; - uint32_t* r = resize_bitmap(nc->data, nc->pixy, nc->pixx, nc->rowstride, - rows, cols, dstride); - if(r == NULL){ - return -1; - } - ncvisual_set_data(nc, r, true); - nc->rowstride = dstride; - nc->pixy = rows; - nc->pixx = cols; - return 0; -} - -int none_blit(struct ncvisual* ncv, int rows, int cols, - ncplane* n, const struct blitset* bset, - const blitterargs* bargs){ - if(rgba_blit_dispatch(n, bset, ncv->rowstride, ncv->data, - rows, cols, bargs) >= 0){ - return 0; - } - return -1; -} - -int none_stream(notcurses* nc, ncvisual* ncv, float timescale, - ncstreamcb streamer, const struct ncvisual_options* vopts, void* curry){ - (void)nc; - (void)ncv; - (void)timescale; - (void)streamer; - (void)vopts; - (void)curry; - return -1; -} - -char* none_subtitle(const ncvisual* ncv){ // no support in none - (void)ncv; - return NULL; -} - -void none_details_seed(ncvisual* ncv){ - (void)ncv; -} - -int none_init(int loglevel __attribute__ ((unused))) { - return 0; // allow success here -} - -void none_printbanner(const notcurses* nc){ - term_fg_palindex(nc, stderr, nc->tcache.colors <= 88 ? 1 % nc->tcache.colors : 0xcb); - fprintf(stderr, "\n Warning! Notcurses was built without multimedia support.\n"); -} - -static const ncvisual_implementation none_impl = { - .visual_init = none_init, - .visual_printbanner = none_printbanner, - .visual_blit = none_blit, - .visual_create = none_create, - .visual_from_file = none_from_file, - .visual_details_seed = none_details_seed, - .visual_decode = none_decode, - .visual_decode_loop = none_decode_loop, - .visual_stream = none_stream, - .visual_subtitle = none_subtitle, - .visual_resize = none_resize, - .visual_destroy = none_destroy, - .canopen_images = false, - .canopen_videos = false, -}; - -const ncvisual_implementation* local_visual_implementation = &none_impl; +const ncvisual_implementation* local_visual_implementation = nullptr; #endif #endif