kmsview: show multiple frames
[android/external-libkmsxx.git] / tests / kmsview.cpp
1 #include <cstdio>
2 #include <fstream>
3 #include <unistd.h>
5 #include "kms++.h"
7 #include "test.h"
9 using namespace std;
10 using namespace kms;
12 static void read_frame(ifstream& is, DumbFramebuffer* fb, Crtc* crtc, Plane* plane)
13 {
14         is.read((char*)fb->map(0), fb->size(0));
16         int r = crtc->set_plane(plane, *fb,
17                                 0, 0, fb->width(), fb->height(),
18                                 0, 0, fb->width(), fb->height());
20         ASSERT(r == 0);
21 }
23 int main(int argc, char** argv)
24 {
25         if (argc != 5) {
26                 printf("Usage: %s <file> <width> <height> <fourcc>\n", argv[0]);
27                 return -1;
28         }
30         string filename = argv[1];
31         uint32_t w = stoi(argv[2]);
32         uint32_t h = stoi(argv[3]);
33         string modestr = argv[4];
35         auto pixfmt = FourCCToPixelFormat(modestr);
38         ifstream is(filename, ifstream::binary);
40         is.seekg(0, std::ios::end);
41         unsigned fsize = is.tellg();
42         is.seekg(0);
45         Card card;
47         auto conn = card.get_first_connected_connector();
48         auto crtc = conn->get_current_crtc();
50         auto fb = new DumbFramebuffer(card, w, h, pixfmt);
52         Plane* plane = 0;
54         for (Plane* p : crtc->get_possible_planes()) {
55                 if (p->plane_type() != PlaneType::Overlay)
56                         continue;
58                 if (!p->supports_format(pixfmt))
59                         continue;
61                 plane = p;
62                 break;
63         }
65         FAIL_IF(!plane, "available plane not found");
68         unsigned num_frames = fsize / fb->size(0);
69         printf("file size %u, frames %u\n", fsize, num_frames);
71         for (unsigned i = 0; i < num_frames; ++i) {
72                 printf("frame %d\n", i);
73                 read_frame(is, fb, crtc, plane);
74                 usleep(1000*50);
75         }
77         printf("press enter to exit\n");
79         is.close();
81         getchar();
83         delete fb;
84 }