]> git.sesse.net Git - nageru/blobdiff - main.cpp
Decode 4:2:2 JPEGs via VA-API if available.
[nageru] / main.cpp
index ccfb281ddecceadde96d16a15331d62e53dbb15f..9bb666a317984e29deaecfea227377086a8987fc 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -28,7 +28,9 @@ extern "C" {
 #include "player.h"
 #include "post_to_main_thread.h"
 #include "ref_counted_gl_sync.h"
+#include "timebase.h"
 #include "ui_mainwindow.h"
+#include "vaapi_jpeg_decoder.h"
 
 using namespace std;
 using namespace std::chrono;
@@ -96,6 +98,8 @@ int main(int argc, char **argv)
 
        thread(record_thread_func).detach();
 
+       init_jpeg_vaapi();
+
        return app.exec();
 }
 
@@ -119,6 +123,12 @@ int record_thread_func()
                if (av_read_frame(format_ctx.get(), &pkt) != 0) {
                        break;
                }
+
+               // Convert pts to our own timebase.
+               // TODO: Figure out offsets, too.
+               AVRational stream_timebase = format_ctx->streams[pkt.stream_index]->time_base;
+               pkt.pts = av_rescale_q(pkt.pts, stream_timebase, AVRational{ 1, TIMEBASE });
+
                //fprintf(stderr, "Got a frame from camera %d, pts = %ld, size = %d\n",
                //      pkt.stream_index, pkt.pts, pkt.size);
                string filename = filename_for_frame(pkt.stream_index, pkt.pts);
@@ -132,22 +142,22 @@ int record_thread_func()
 
                post_to_main_thread([pkt] {
                        if (pkt.stream_index == 0) {
-                               global_mainwindow->ui->input1_display->setFrame(pkt.stream_index, pkt.pts);
+                               global_mainwindow->ui->input1_display->setFrame(pkt.stream_index, pkt.pts, /*interpolated=*/false);
                        } else if (pkt.stream_index == 1) {
-                               global_mainwindow->ui->input2_display->setFrame(pkt.stream_index, pkt.pts);
+                               global_mainwindow->ui->input2_display->setFrame(pkt.stream_index, pkt.pts, /*interpolated=*/false);
                        } else if (pkt.stream_index == 2) {
-                               global_mainwindow->ui->input3_display->setFrame(pkt.stream_index, pkt.pts);
+                               global_mainwindow->ui->input3_display->setFrame(pkt.stream_index, pkt.pts, /*interpolated=*/false);
                        } else if (pkt.stream_index == 3) {
-                               global_mainwindow->ui->input4_display->setFrame(pkt.stream_index, pkt.pts);
+                               global_mainwindow->ui->input4_display->setFrame(pkt.stream_index, pkt.pts, /*interpolated=*/false);
                        }
                });
 
                assert(pkt.stream_index < MAX_STREAMS);
                frames[pkt.stream_index].push_back(pkt.pts);
 
-               // Hack. Assumes a given timebase.
+               // Hack. Remove when we're dealing with live streams.
                if (last_pts != -1) {
-                       this_thread::sleep_for(microseconds((pkt.pts - last_pts) * 1000000 / 12800));
+                       this_thread::sleep_for(microseconds((pkt.pts - last_pts) * 1000000 / TIMEBASE));
                }
                last_pts = pkt.pts;
                current_pts = pkt.pts;