From 000da7d64044c4ea2a1679c2864252fee9895d48 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 22 Feb 2025 01:05:29 +0100 Subject: Make image output lossy (use stb image writer), also significantly improves performance for jpeg --- include/capture/capture.h | 20 ++++++++++++++------ include/encoder/video/image.h | 15 --------------- include/image_writer.h | 31 +++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 21 deletions(-) delete mode 100644 include/encoder/video/image.h create mode 100644 include/image_writer.h (limited to 'include') diff --git a/include/capture/capture.h b/include/capture/capture.h index dc5b7ac..634eee0 100644 --- a/include/capture/capture.h +++ b/include/capture/capture.h @@ -13,31 +13,39 @@ typedef struct AVMasteringDisplayMetadata AVMasteringDisplayMetadata; typedef struct AVContentLightMetadata AVContentLightMetadata; typedef struct gsr_capture gsr_capture; +typedef struct { + int width; + int height; + int fps; + AVCodecContext *video_codec_context; /* can be NULL */ + AVFrame *frame; /* can be NULL, but will never be NULL if |video_codec_context| is set */ +} gsr_capture_metadata; + struct gsr_capture { /* These methods should not be called manually. Call gsr_capture_* instead */ - int (*start)(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame *frame); + int (*start)(gsr_capture *cap, gsr_capture_metadata *capture_metadata); void (*on_event)(gsr_capture *cap, gsr_egl *egl); /* can be NULL */ void (*tick)(gsr_capture *cap); /* can be NULL. If there is an event then |on_event| is called before this */ bool (*should_stop)(gsr_capture *cap, bool *err); /* can be NULL. If NULL, return false */ - int (*capture)(gsr_capture *cap, AVFrame *frame, gsr_color_conversion *color_conversion); + int (*capture)(gsr_capture *cap, gsr_capture_metadata *capture_metadata, gsr_color_conversion *color_conversion); bool (*uses_external_image)(gsr_capture *cap); /* can be NULL. If NULL, return false */ bool (*set_hdr_metadata)(gsr_capture *cap, AVMasteringDisplayMetadata *mastering_display_metadata, AVContentLightMetadata *light_metadata); /* can be NULL. If NULL, return false */ uint64_t (*get_window_id)(gsr_capture *cap); /* can be NULL. Returns 0 if unknown */ bool (*is_damaged)(gsr_capture *cap); /* can be NULL */ void (*clear_damage)(gsr_capture *cap); /* can be NULL */ - void (*destroy)(gsr_capture *cap, AVCodecContext *video_codec_context); + void (*destroy)(gsr_capture *cap); void *priv; /* can be NULL */ bool started; }; -int gsr_capture_start(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame *frame); +int gsr_capture_start(gsr_capture *cap, gsr_capture_metadata *capture_metadata); void gsr_capture_on_event(gsr_capture *cap, gsr_egl *egl); void gsr_capture_tick(gsr_capture *cap); bool gsr_capture_should_stop(gsr_capture *cap, bool *err); -int gsr_capture_capture(gsr_capture *cap, AVFrame *frame, gsr_color_conversion *color_conversion); +int gsr_capture_capture(gsr_capture *cap, gsr_capture_metadata *capture_metadata, gsr_color_conversion *color_conversion); bool gsr_capture_uses_external_image(gsr_capture *cap); bool gsr_capture_set_hdr_metadata(gsr_capture *cap, AVMasteringDisplayMetadata *mastering_display_metadata, AVContentLightMetadata *light_metadata); -void gsr_capture_destroy(gsr_capture *cap, AVCodecContext *video_codec_context); +void gsr_capture_destroy(gsr_capture *cap); #endif /* GSR_CAPTURE_CAPTURE_H */ diff --git a/include/encoder/video/image.h b/include/encoder/video/image.h deleted file mode 100644 index 76c7bd4..0000000 --- a/include/encoder/video/image.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef GSR_ENCODER_VIDEO_IMAGE_H -#define GSR_ENCODER_VIDEO_IMAGE_H - -#include "video.h" - -typedef struct gsr_egl gsr_egl; - -typedef struct { - gsr_egl *egl; - gsr_color_depth color_depth; -} gsr_video_encoder_image_params; - -gsr_video_encoder* gsr_video_encoder_image_create(const gsr_video_encoder_image_params *params); - -#endif /* GSR_ENCODER_VIDEO_IMAGE_H */ diff --git a/include/image_writer.h b/include/image_writer.h new file mode 100644 index 0000000..79f549e --- /dev/null +++ b/include/image_writer.h @@ -0,0 +1,31 @@ +#ifndef GSR_IMAGE_WRITER_H +#define GSR_IMAGE_WRITER_H + +#include + +typedef struct gsr_egl gsr_egl; + +typedef enum { + GSR_IMAGE_FORMAT_JPEG, + GSR_IMAGE_FORMAT_PNG +} gsr_image_format; + +typedef enum { + GSR_IMAGE_WRITER_SOURCE_OPENGL +} gsr_image_writer_source; + +typedef struct { + gsr_image_writer_source source; + gsr_egl *egl; + int width; + int height; + unsigned int texture; +} gsr_image_writer; + +bool gsr_image_writer_init(gsr_image_writer *self, gsr_image_writer_source source, gsr_egl *egl, int width, int height); +void gsr_image_writer_deinit(gsr_image_writer *self); + +/* Quality is between 1 and 100 where 100 is the max quality. Quality doesn't apply to lossless formats */ +bool gsr_image_writer_write_to_file(gsr_image_writer *self, const char *filepath, gsr_image_format image_format, int quality); + +#endif /* GSR_IMAGE_WRITER_H */ -- cgit v1.2.3-70-g09d2