notcurses/tests/libav.cpp

144 lines
4.0 KiB
C++
Raw Normal View History

2019-11-25 03:22:18 +00:00
#include <notcurses.h>
2019-12-25 07:00:53 +00:00
#include "version.h"
2019-11-25 03:22:18 +00:00
#include "main.h"
#ifndef DISABLE_FFMPEG
#include <libavutil/pixdesc.h>
#include <libavutil/avconfig.h>
#include <libavcodec/avcodec.h> // ffmpeg doesn't reliably "C"-guard itself
#endif
2019-11-25 03:22:18 +00:00
TEST_CASE("Multimedia") {
if(getenv("TERM") == nullptr){
return;
2019-11-25 03:22:18 +00:00
}
notcurses_options nopts{};
nopts.inhibit_alternate_screen = true;
2019-12-28 23:37:44 +00:00
nopts.suppress_banner = true;
FILE* outfp_ = fopen("/dev/tty", "wb");
REQUIRE(outfp_);
notcurses* nc_ = notcurses_init(&nopts, outfp_);
REQUIRE(nc_);
ncplane* ncp_ = notcurses_stdplane(nc_);
REQUIRE(ncp_);
2019-11-25 03:22:18 +00:00
2019-12-27 10:13:29 +00:00
#ifdef DISABLE_FFMPEG
SUBCASE("LibavDisabled"){
REQUIRE(!notcurses_canopen(nc_));
}
2019-12-27 10:13:29 +00:00
#else
SUBCASE("LibavEnabled"){
REQUIRE(notcurses_canopen(nc_));
}
2019-12-27 10:13:29 +00:00
SUBCASE("LoadImageCreatePlane") {
int averr;
int dimy, dimx;
ncplane_dim_yx(ncp_, &dimy, &dimx);
auto ncv = ncvisual_open_plane(nc_, find_data("dsscaw-purp.png"), &averr, 0, 0, NCSCALE_STRETCH);
REQUIRE(ncv);
REQUIRE(0 == averr);
auto frame = ncvisual_decode(ncv, &averr);
REQUIRE(frame);
REQUIRE(0 == averr);
CHECK(dimy * 2 == frame->height);
CHECK(dimx == frame->width);
CHECK(0 == ncvisual_render(ncv, 0, 0, 0, 0));
CHECK(0 == notcurses_render(nc_));
frame = ncvisual_decode(ncv, &averr);
REQUIRE_EQ(nullptr, frame);
CHECK(AVERROR_EOF == averr);
ncvisual_destroy(ncv);
}
SUBCASE("LoadImage") {
int averr;
int dimy, dimx;
ncplane_dim_yx(ncp_, &dimy, &dimx);
2019-12-27 22:43:24 +00:00
auto ncv = ncplane_visual_open(ncp_, find_data("dsscaw-purp.png"), &averr);
REQUIRE(ncv);
REQUIRE(0 == averr);
auto frame = ncvisual_decode(ncv, &averr);
REQUIRE(frame);
REQUIRE(0 == averr);
CHECK(dimy * 2 == frame->height);
CHECK(dimx == frame->width);
CHECK(0 == ncvisual_render(ncv, 0, 0, 0, 0));
CHECK(0 == notcurses_render(nc_));
frame = ncvisual_decode(ncv, &averr);
REQUIRE_EQ(nullptr, frame);
CHECK(AVERROR_EOF == averr);
ncvisual_destroy(ncv);
}
2019-12-27 10:13:29 +00:00
2020-01-15 17:22:10 +00:00
SUBCASE("PlaneDuplicate") {
int averr;
int dimy, dimx;
ncplane_dim_yx(ncp_, &dimy, &dimx);
2020-01-15 17:22:10 +00:00
auto ncv = ncplane_visual_open(ncp_, find_data("dsscaw-purp.png"), &averr);
REQUIRE(ncv);
2020-01-15 17:22:10 +00:00
REQUIRE(0 == averr);
auto frame = ncvisual_decode(ncv, &averr);
REQUIRE(frame);
2020-01-15 17:22:10 +00:00
REQUIRE(0 == averr);
CHECK(dimy * 2 == frame->height);
CHECK(dimx == frame->width);
CHECK(0 == ncvisual_render(ncv, 0, 0, 0, 0));
2020-01-15 17:22:10 +00:00
void* needle = malloc(1);
REQUIRE(nullptr != needle);
struct ncplane* newn = ncplane_dup(ncvisual_plane(ncv), needle);
int ndimx, ndimy;
REQUIRE(nullptr != newn);
ncvisual_destroy(ncv);
ncplane_erase(ncp_);
// should still have the image
CHECK(0 == notcurses_render(nc_));
2020-01-15 17:22:10 +00:00
ncplane_dim_yx(newn, &ndimy, &ndimx);
CHECK(ndimy == dimy);
CHECK(ndimx == dimx);
}
SUBCASE("LoadVideo") {
int averr;
int dimy, dimx;
ncplane_dim_yx(ncp_, &dimy, &dimx);
auto ncv = ncplane_visual_open(ncp_, find_data("samoa.avi"), &averr);
REQUIRE(ncv);
CHECK(0 == averr);
for(;;){ // run at the highest speed we can
auto frame = ncvisual_decode(ncv, &averr);
if(!frame){
CHECK(AVERROR_EOF == averr);
break;
}
CHECK(0 == averr);
CHECK(dimy * 2 == frame->height);
CHECK(dimx == frame->width);
CHECK(0 == ncvisual_render(ncv, 0, 0, 0, 0));
CHECK(0 == notcurses_render(nc_));
}
ncvisual_destroy(ncv);
}
2019-11-27 01:19:16 +00:00
SUBCASE("LoadVideoCreatePlane") {
int averr;
int dimy, dimx;
ncplane_dim_yx(ncp_, &dimy, &dimx);
2019-12-27 22:43:24 +00:00
auto ncv = ncvisual_open_plane(nc_, find_data("fm6.mkv"), &averr, 0, 0, NCSCALE_STRETCH);
REQUIRE(ncv);
CHECK(0 == averr);
auto frame = ncvisual_decode(ncv, &averr);
REQUIRE_NE(nullptr, frame);
CHECK(0 == averr);
CHECK(dimy * 2 == frame->height);
CHECK(dimx == frame->width);
CHECK(0 == ncvisual_render(ncv, 0, 0, 0, 0));
CHECK(0 == notcurses_render(nc_));
ncvisual_destroy(ncv);
}
#endif
Per-line damage map, ~50% increase in FPS on notcurses-demo (#144) Implement a fairly conservative, line-granularity, two-level damage map. One on the overall notcurses object is dirtied by planar moves, creations, deletions, and resizes. One on each ncplane is dirtied by glyph output, media rendering, fades, and erasure. #83 This has some definite false positives: a hidden plane which moves will damage a bunch of lines unnecessarily. For now, don't do things like that :D. Extra byte per line per plane, shouldn't be a problem. Two new stats for cell elisions and emissions Allow keypress to interrupt view-demo ncvisual_stream() now allows a callback per frame Allow ncvisual_open() to create its own, perfectly-sized, ncplane #128 Typical performance prior to this PR: 4655 renders, 18.3s total (0.000305s min, 0.196s max, 0.0039s avg 253.9 fps) 401046.505KB total (9.688KB min, 139.697KB max, 86.15KB avg) Emits/elides: def 1082115/116196 fg 10547624/7236460 bg 10602717/6208644 Elide rates: 9.70% 40.69% 36.93% 4680 renders, 18.4s total (0.000285s min, 0.15s max, 0.0039s avg 255.0 fps) 403078.188KB total (9.688KB min, 139.697KB max, 86.13KB avg) Emits/elides: def 1088994/116196 fg 10604983/7267750 bg 10655426/6237472 Elide rates: 9.64% 40.66% 36.92% 4699 renders, 17.8s total (0.000227s min, 0.192s max, 0.0038s avg 263.8 fps) 403266.907KB total (9.688KB min, 139.697KB max, 85.82KB avg) Emits/elides: def 1086511/116196 fg 10601709/7359116 bg 10661910/6326744 Elide rates: 9.66% 40.97% 37.24% After this PR: 5625 renders, 15s total (9.36e-05s min, 0.187s max, 0.0027s avg 375.2 fps) 168365.640KB total (0.930KB min, 139.600KB max, 29.93KB avg) Emits/elides: def 310575/116196 fg 4486002/4473416 bg 4116835/4630666 Elide rates: 27.23% 49.93% 52.94% Cells emitted; 9928000 elided: 12572000 (55.88%) 5642 renders, 14.2s total (9.17e-05s min, 0.154s max, 0.0025s avg 397.0 fps) 168669.009KB total (0.605KB min, 139.600KB max, 29.90KB avg) Emits/elides: def 310819/116196 fg 4499833/4482134 bg 4118562/4652470 Elide rates: 27.21% 49.90% 53.04% Cells emitted; 9962160 elided: 12605840 (55.86%) 5650 renders, 14.3s total (0.000118s min, 0.143s max, 0.0025s avg 395.7 fps) 169461.884KB total (0.860KB min, 139.600KB max, 29.99KB avg) Emits/elides: def 305431/116196 fg 4515396/4456376 bg 4149967/4613668 Elide rates: 27.56% 49.67% 52.65% Cells emitted; 9945200 elided: 12654800 (55.99%) on netcurses-demo, we're eliding about half of the total cells via this damage map. that's pretty fucking sweet! FPS increase of about 50% -- I'll take that any day of the fuckin' week, boyo. w00t! https://www.youtube.com/watch?v=XbGs_qK2PQA
2019-12-15 18:46:47 +00:00
CHECK(!notcurses_stop(nc_));
CHECK(!fclose(outfp_));
2019-11-25 03:22:18 +00:00
}