kill 'none' multimedia implementation #1718

pull/1725/head
nick black 3 years ago
parent bf62f5ac3f
commit 73ed97993f
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC

@ -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;

@ -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

Loading…
Cancel
Save