diff options
Diffstat (limited to 'demos/plplay.h')
-rw-r--r-- | demos/plplay.h | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/demos/plplay.h b/demos/plplay.h new file mode 100644 index 0000000..2036562 --- /dev/null +++ b/demos/plplay.h @@ -0,0 +1,138 @@ +#include <libavcodec/avcodec.h> +#include <libavformat/avformat.h> + +#include <libplacebo/options.h> +#include <libplacebo/utils/frame_queue.h> + +#include "common.h" +#include "pl_thread.h" + +#define MAX_FRAME_PASSES 256 +#define MAX_BLEND_PASSES 8 +#define MAX_BLEND_FRAMES 8 + +enum { + ZOOM_PAD = 0, + ZOOM_CROP, + ZOOM_STRETCH, + ZOOM_FIT, + ZOOM_RAW, + ZOOM_400, + ZOOM_200, + ZOOM_100, + ZOOM_50, + ZOOM_25, + ZOOM_COUNT, +}; + +struct plplay_args { + const struct pl_render_params *preset; + enum pl_log_level verbosity; + const char *window_impl; + const char *filename; + bool hwdec; +}; + +bool parse_args(struct plplay_args *args, int argc, char *argv[]); + +struct plplay { + struct plplay_args args; + struct window *win; + struct ui *ui; + char cache_file[512]; + + // libplacebo + pl_log log; + pl_renderer renderer; + pl_queue queue; + pl_cache cache; + + // libav* + AVFormatContext *format; + AVCodecContext *codec; + const AVStream *stream; // points to first video stream of `format` + pl_thread decoder_thread; + bool decoder_thread_created; + bool exit_thread; + + // settings / ui state + pl_options opts; + pl_rotation target_rot; + int target_zoom; + bool colorspace_hint; + bool colorspace_hint_dynamic; + bool ignore_dovi; + bool toggle_fullscreen; + bool advanced_scalers; + + bool target_override; // if false, fields below are ignored + struct pl_color_repr force_repr; + enum pl_color_primaries force_prim; + enum pl_color_transfer force_trc; + struct pl_hdr_metadata force_hdr; + bool force_hdr_enable; + bool fps_override; + float fps; + + // ICC profile + pl_icc_object icc; + char *icc_name; + bool use_icc_luma; + bool force_bpc; + + // custom shaders + const struct pl_hook **shader_hooks; + char **shader_paths; + size_t shader_num; + size_t shader_size; + + // pass metadata + struct pl_dispatch_info blend_info[MAX_BLEND_FRAMES][MAX_BLEND_PASSES]; + struct pl_dispatch_info frame_info[MAX_FRAME_PASSES]; + int num_frame_passes; + int num_blend_passes[MAX_BLEND_FRAMES]; + + // playback statistics + struct { + _Atomic uint32_t decoded; + uint32_t rendered; + uint32_t mapped; + uint32_t dropped; + uint32_t missed; + uint32_t stalled; + double missed_ms; + double stalled_ms; + double current_pts; + + struct timing { + double sum, sum2, peak; + uint64_t count; + } acquire, update, render, draw_ui, sleep, submit, swap, + vsync_interval, pts_interval; + } stats; +}; + +void update_settings(struct plplay *p, const struct pl_frame *target); + +static inline void apply_csp_overrides(struct plplay *p, struct pl_color_space *csp) +{ + if (p->force_prim) { + csp->primaries = p->force_prim; + csp->hdr.prim = *pl_raw_primaries_get(csp->primaries); + } + if (p->force_trc) + csp->transfer = p->force_trc; + if (p->force_hdr_enable) { + struct pl_hdr_metadata fix = p->force_hdr; + fix.prim = csp->hdr.prim; + csp->hdr = fix; + } else if (p->colorspace_hint_dynamic) { + pl_color_space_nominal_luma_ex(pl_nominal_luma_params( + .color = csp, + .metadata = PL_HDR_METADATA_ANY, + .scaling = PL_HDR_NITS, + .out_min = &csp->hdr.min_luma, + .out_max = &csp->hdr.max_luma, + )); + } +} |