X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=video_widget.cpp;h=a5b45136537552282d1ec8c118f5cd998de51adb;hb=9e66d05fae0b4f88f2662754c0f0747f83e49ffa;hp=3cb5fa1faa38d8a33cd615d014e8ba1a6ebf96e4;hpb=3ea646d51ad82169f61354700d729c703d31c9d3;p=pkanalytics diff --git a/video_widget.cpp b/video_widget.cpp index 3cb5fa1..a5b4513 100644 --- a/video_widget.cpp +++ b/video_widget.cpp @@ -32,6 +32,7 @@ extern "C" { #include #include +#include using namespace std; using namespace std::chrono; @@ -138,7 +139,7 @@ bool VideoWidget::process_queued_commands(AVFormatContext *format_ctx, AVCodecCo relative_seek_ms += cmd.relative_seek_ms; relative_seek_frames += cmd.relative_seek_frames; } else if (cmd.command == QueuedCommand::SEEK_ABSOLUTE) { - base_pts = cmd.seek_ms; + base_pts = av_rescale_q(cmd.seek_ms, AVRational{ 1, 1000 }, video_timebase); relative_seek_ms = 0; relative_seek_frames = 0; } @@ -491,6 +492,47 @@ void VideoWidget::wheelEvent(QWheelEvent *event) matmul3x3(tmp2, translation_matrix, zoom_matrix); fixup_zoom_matrix(); + update(); +} + +void VideoWidget::mousePressEvent(QMouseEvent *e) +{ + if (e->button() == Qt::BackButton) { + emit mouse_back_clicked(); + } else if (e->button() == Qt::ForwardButton) { + emit mouse_forward_clicked(); + } else if (e->button() == Qt::LeftButton) { + dragging = true; + last_drag_x = e->position().x(); + last_drag_y = e->position().y(); + } +} + +void VideoWidget::mouseReleaseEvent(QMouseEvent *e) +{ + if (e->button() == Qt::LeftButton) { + dragging = false; + } +} + +void VideoWidget::mouseMoveEvent(QMouseEvent *e) +{ + if (!dragging) { + return; + } + float dx = (e->position().x() - last_drag_x) / width(); + float dy = (e->position().y() - last_drag_y) / height(); + + //zoom_matrix[6] += dx * zoom_matrix[0]; + //zoom_matrix[7] += dy * zoom_matrix[4]; + zoom_matrix[6] += dx; + zoom_matrix[7] -= dy; + fixup_zoom_matrix(); + + last_drag_x = e->position().x(); + last_drag_y = e->position().y(); + + update(); } // Normalize the matrix so that we never get skew or similar, @@ -702,15 +744,14 @@ AVFrameWithDeleter VideoWidget::decode_frame(AVFormatContext *format_ctx, AVCode AVFrameWithDeleter video_avframe = av_frame_alloc_unique(); bool eof = false; do { - AVPacket pkt; + AVPacket *pkt = av_packet_alloc(); unique_ptr pkt_cleanup( - &pkt, av_packet_unref); - av_init_packet(&pkt); - pkt.data = nullptr; - pkt.size = 0; - if (av_read_frame(format_ctx, &pkt) == 0) { - if (pkt.stream_index == video_stream_index) { - if (avcodec_send_packet(video_codec_ctx, &pkt) < 0) { + pkt, av_packet_unref); + pkt->data = nullptr; + pkt->size = 0; + if (av_read_frame(format_ctx, pkt) == 0) { + if (pkt->stream_index == video_stream_index) { + if (avcodec_send_packet(video_codec_ctx, pkt) < 0) { fprintf(stderr, "%s: Cannot send packet to video codec.\n", pathname.c_str()); *error = true; return AVFrameWithDeleter(nullptr);