X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=video_widget.h;h=24aaea3b6a8129e179ff6c7c23343b7dc4872874;hb=86c1674e30b19750b55581743c3bdc9a2853dd13;hp=c0f28d75ec7ad8ff99e14e245e49e51054385a93;hpb=fd038d3480948dca80cdb41f4d764295918db30d;p=pkanalytics diff --git a/video_widget.h b/video_widget.h index c0f28d7..24aaea3 100644 --- a/video_widget.h +++ b/video_widget.h @@ -44,20 +44,28 @@ public: void mouseReleaseEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); + // Should really have a PBO, but this is OK for now. + // public due to shared_ptr. + struct Frame { + unsigned width, height; + unsigned chroma_width, chroma_height; + std::unique_ptr data; // Y, followed by Cb, followed by Cr. + VideoWidget *owner; // For the freelist. + }; + signals: void position_changed(uint64_t pos); void mouse_back_clicked(); void mouse_forward_clicked(); private: - // Should really have been persistent and a PBO, but this is OK for now. - struct Frame { - unsigned width, height; - unsigned chroma_width, chroma_height; - std::unique_ptr data; // Y, followed by Cb, followed by Cr. - }; + std::shared_ptr alloc_frame(unsigned width, unsigned height, unsigned chroma_width, unsigned chroma_height); + static void free_frame(Frame *frame); + std::mutex current_frame_mu; std::shared_ptr current_frame; // Protected by current_frame_mu. + std::mutex freelist_mu; + std::deque frame_freelist; // Protected by freelist_mu. std::deque queued_frames; // Frames decoded but not displayed. Only used when frame-stepping backwards. GLuint ycbcr_vertex_shader, ycbcr_fragment_shader, ycbcr_program; @@ -110,7 +118,7 @@ private: AVFrameWithDeleter decode_frame(AVFormatContext *format_ctx, AVCodecContext *video_codec_ctx, const std::string &pathname, int video_stream_index, bool *error); - Frame make_video_frame(const AVFrame *frame); + std::shared_ptr make_video_frame(const AVFrame *frame); bool process_queued_commands(AVFormatContext *format_ctx, AVCodecContext *video_codec_ctx, int video_stream_index, bool *seeked); void store_pts(int64_t pts);