Cleanup: more C++ constructs in VSE render.hh and friends

- enum class StripEarlyOut instead of raw integer defines
- SeqRenderState default initializer instead of seq_render_state_init
- Vector<Sequence*> instead of manually sized arrays of pointers
- some const to several function arguments

Pull Request: https://projects.blender.org/blender/blender/pulls/117829
This commit is contained in:
Aras Pranckevicius 2024-02-05 11:37:42 +02:00 committed by Gitea
parent 3d7e84f57d
commit 4cf2d95bb5
7 changed files with 166 additions and 192 deletions

View File

@ -13,6 +13,13 @@ struct SeqRenderData;
struct Sequence;
struct TextVars;
enum class StripEarlyOut {
NoInput = -1, /* No input needed. */
DoEffect = 0, /* No early out (do the effect). */
UseInput1 = 1, /* Output = input1. */
UseInput2 = 2, /* Output = input2. */
};
/* Wipe effect */
enum {
DO_SINGLE_WIPE,
@ -40,19 +47,18 @@ struct SeqEffectHandle {
void (*load)(Sequence *seqconst);
/* duplicate */
void (*copy)(Sequence *dst, Sequence *src, int flag);
void (*copy)(Sequence *dst, const Sequence *src, int flag);
/* destruct */
void (*free)(Sequence *seq, bool do_id_user);
/* returns: -1: no input needed,
* 0: no early out,
* 1: out = ibuf1,
* 2: out = ibuf2 */
int (*early_out)(Sequence *seq, float fac);
StripEarlyOut (*early_out)(const Sequence *seq, float fac);
/* sets the default `fac` value */
void (*get_default_fac)(const Scene *scene, Sequence *seq, float timeline_frame, float *fac);
void (*get_default_fac)(const Scene *scene,
const Sequence *seq,
float timeline_frame,
float *fac);
/* execute the effect
* sequence effects are only required to either support
@ -73,9 +79,9 @@ struct SeqEffectHandle {
Sequence *seq,
float timeline_frame,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf *ibuf3,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf *ibuf3,
int start_line,
int total_lines,
ImBuf *out);

View File

@ -290,9 +290,9 @@ static void do_alphaover_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -355,9 +355,9 @@ static void do_alphaunder_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -435,9 +435,9 @@ static void do_cross_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -519,9 +519,9 @@ static void do_gammacross_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -598,9 +598,9 @@ static void do_add_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -679,9 +679,9 @@ static void do_sub_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -840,9 +840,9 @@ static void do_mul_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -1038,9 +1038,9 @@ static void do_blend_mode_effect(const SeqRenderData *context,
Sequence *seq,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -1084,9 +1084,9 @@ static void do_colormix_effect(const SeqRenderData *context,
Sequence *seq,
float /*timeline_frame*/,
float /*fac*/,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -1403,7 +1403,7 @@ static void free_wipe_effect(Sequence *seq, const bool /*do_id_user*/)
MEM_SAFE_FREE(seq->effectdata);
}
static void copy_wipe_effect(Sequence *dst, Sequence *src, const int /*flag*/)
static void copy_wipe_effect(Sequence *dst, const Sequence *src, const int /*flag*/)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
}
@ -1528,7 +1528,7 @@ static void free_transform_effect(Sequence *seq, const bool /*do_id_user*/)
MEM_SAFE_FREE(seq->effectdata);
}
static void copy_transform_effect(Sequence *dst, Sequence *src, const int /*flag*/)
static void copy_transform_effect(Sequence *dst, const Sequence *src, const int /*flag*/)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
}
@ -1537,7 +1537,7 @@ static void transform_image(int x,
int y,
int start_line,
int total_lines,
ImBuf *ibuf,
const ImBuf *ibuf,
ImBuf *out,
float scale_x,
float scale_y,
@ -1608,9 +1608,9 @@ static void do_transform_effect(const SeqRenderData *context,
Sequence *seq,
float /*timeline_frame*/,
float /*fac*/,
ImBuf *ibuf1,
ImBuf * /*ibuf2*/,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf * /*ibuf2*/,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -1800,7 +1800,7 @@ static void free_glow_effect(Sequence *seq, const bool /*do_id_user*/)
MEM_SAFE_FREE(seq->effectdata);
}
static void copy_glow_effect(Sequence *dst, Sequence *src, const int /*flag*/)
static void copy_glow_effect(Sequence *dst, const Sequence *src, const int /*flag*/)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
}
@ -1938,14 +1938,14 @@ static void free_solid_color(Sequence *seq, const bool /*do_id_user*/)
MEM_SAFE_FREE(seq->effectdata);
}
static void copy_solid_color(Sequence *dst, Sequence *src, const int /*flag*/)
static void copy_solid_color(Sequence *dst, const Sequence *src, const int /*flag*/)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
}
static int early_out_color(Sequence * /*seq*/, float /*fac*/)
static StripEarlyOut early_out_color(const Sequence * /*seq*/, float /*fac*/)
{
return EARLY_NO_INPUT;
return StripEarlyOut::NoInput;
}
static ImBuf *do_solid_color(const SeqRenderData *context,
@ -2009,9 +2009,9 @@ static int num_inputs_multicam()
return 0;
}
static int early_out_multicam(Sequence * /*seq*/, float /*fac*/)
static StripEarlyOut early_out_multicam(const Sequence * /*seq*/, float /*fac*/)
{
return EARLY_NO_INPUT;
return StripEarlyOut::NoInput;
}
static ImBuf *do_multicam(const SeqRenderData *context,
@ -2057,9 +2057,9 @@ static int num_inputs_adjustment()
return 0;
}
static int early_out_adjustment(Sequence * /*seq*/, float /*fac*/)
static StripEarlyOut early_out_adjustment(const Sequence * /*seq*/, float /*fac*/)
{
return EARLY_NO_INPUT;
return StripEarlyOut::NoInput;
}
static ImBuf *do_adjustment_impl(const SeqRenderData *context, Sequence *seq, float timeline_frame)
@ -2166,7 +2166,7 @@ static void free_speed_effect(Sequence *seq, const bool /*do_id_user*/)
MEM_SAFE_FREE(seq->effectdata);
}
static void copy_speed_effect(Sequence *dst, Sequence *src, const int /*flag*/)
static void copy_speed_effect(Sequence *dst, const Sequence *src, const int /*flag*/)
{
SpeedControlVars *v;
dst->effectdata = MEM_dupallocN(src->effectdata);
@ -2174,9 +2174,9 @@ static void copy_speed_effect(Sequence *dst, Sequence *src, const int /*flag*/)
v->frameMap = nullptr;
}
static int early_out_speed(Sequence * /*seq*/, float /*fac*/)
static StripEarlyOut early_out_speed(const Sequence * /*seq*/, float /*fac*/)
{
return EARLY_DO_EFFECT;
return StripEarlyOut::DoEffect;
}
static FCurve *seq_effect_speed_speed_factor_curve_get(Scene *scene, Sequence *seq)
@ -2326,9 +2326,9 @@ static void do_overdrop_effect(const SeqRenderData *context,
Sequence * /*seq*/,
float /*timeline_frame*/,
float fac,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf * /*ibuf3*/,
const ImBuf *ibuf1,
const ImBuf *ibuf2,
const ImBuf * /*ibuf3*/,
int start_line,
int total_lines,
ImBuf *out)
@ -2381,18 +2381,18 @@ static void free_gaussian_blur_effect(Sequence *seq, const bool /*do_id_user*/)
MEM_SAFE_FREE(seq->effectdata);
}
static void copy_gaussian_blur_effect(Sequence *dst, Sequence *src, const int /*flag*/)
static void copy_gaussian_blur_effect(Sequence *dst, const Sequence *src, const int /*flag*/)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
}
static int early_out_gaussian_blur(Sequence *seq, float /*fac*/)
static StripEarlyOut early_out_gaussian_blur(const Sequence *seq, float /*fac*/)
{
GaussianBlurVars *data = static_cast<GaussianBlurVars *>(seq->effectdata);
if (data->size_x == 0.0f && data->size_y == 0) {
return EARLY_USE_INPUT_1;
return StripEarlyOut::UseInput1;
}
return EARLY_DO_EFFECT;
return StripEarlyOut::DoEffect;
}
static blender::Array<float> make_gaussian_blur_kernel(float rad, int size)
@ -2679,7 +2679,7 @@ static void load_text_effect(Sequence *seq)
SEQ_effect_text_font_load(data, false);
}
static void copy_text_effect(Sequence *dst, Sequence *src, const int flag)
static void copy_text_effect(Sequence *dst, const Sequence *src, const int flag)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
TextVars *data = static_cast<TextVars *>(dst->effectdata);
@ -2693,16 +2693,16 @@ static int num_inputs_text()
return 0;
}
static int early_out_text(Sequence *seq, float /*fac*/)
static StripEarlyOut early_out_text(const Sequence *seq, float /*fac*/)
{
TextVars *data = static_cast<TextVars *>(seq->effectdata);
if (data->text[0] == 0 || data->text_size < 1.0f ||
((data->color[3] == 0.0f) &&
(data->shadow_color[3] == 0.0f || (data->flag & SEQ_TEXT_SHADOW) == 0)))
{
return EARLY_USE_INPUT_1;
return StripEarlyOut::UseInput1;
}
return EARLY_NO_INPUT;
return StripEarlyOut::NoInput;
}
static ImBuf *do_text_effect(const SeqRenderData *context,
@ -2842,7 +2842,7 @@ static int num_inputs_default()
return 2;
}
static void copy_effect_default(Sequence *dst, Sequence *src, const int /*flag*/)
static void copy_effect_default(Sequence *dst, const Sequence *src, const int /*flag*/)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
}
@ -2852,40 +2852,40 @@ static void free_effect_default(Sequence *seq, const bool /*do_id_user*/)
MEM_SAFE_FREE(seq->effectdata);
}
static int early_out_noop(Sequence * /*seq*/, float /*fac*/)
static StripEarlyOut early_out_noop(const Sequence * /*seq*/, float /*fac*/)
{
return EARLY_DO_EFFECT;
return StripEarlyOut::DoEffect;
}
static int early_out_fade(Sequence * /*seq*/, float fac)
static StripEarlyOut early_out_fade(const Sequence * /*seq*/, float fac)
{
if (fac == 0.0f) {
return EARLY_USE_INPUT_1;
return StripEarlyOut::UseInput1;
}
if (fac == 1.0f) {
return EARLY_USE_INPUT_2;
return StripEarlyOut::UseInput2;
}
return EARLY_DO_EFFECT;
return StripEarlyOut::DoEffect;
}
static int early_out_mul_input2(Sequence * /*seq*/, float fac)
static StripEarlyOut early_out_mul_input2(const Sequence * /*seq*/, float fac)
{
if (fac == 0.0f) {
return EARLY_USE_INPUT_1;
return StripEarlyOut::UseInput1;
}
return EARLY_DO_EFFECT;
return StripEarlyOut::DoEffect;
}
static int early_out_mul_input1(Sequence * /*seq*/, float fac)
static StripEarlyOut early_out_mul_input1(const Sequence * /*seq*/, float fac)
{
if (fac == 0.0f) {
return EARLY_USE_INPUT_2;
return StripEarlyOut::UseInput2;
}
return EARLY_DO_EFFECT;
return StripEarlyOut::DoEffect;
}
static void get_default_fac_noop(const Scene * /*scene*/,
Sequence * /*seq*/,
const Sequence * /*seq*/,
float /*timeline_frame*/,
float *fac)
{
@ -2893,7 +2893,7 @@ static void get_default_fac_noop(const Scene * /*scene*/,
}
static void get_default_fac_fade(const Scene *scene,
Sequence *seq,
const Sequence *seq,
float timeline_frame,
float *fac)
{

View File

@ -86,7 +86,6 @@ static ImBuf *modifier_render_mask_input(const SeqRenderData *context,
if (mask_input_type == SEQUENCE_MASK_INPUT_STRIP) {
if (mask_sequence) {
SeqRenderState state;
seq_render_state_init(&state);
mask_input = seq_render_strip(context, &state, mask_sequence, timeline_frame);

View File

@ -401,12 +401,11 @@ static bool seq_prefetch_scene_strip_is_rendered(PrefetchJob *pfjob,
bool is_recursive_check)
{
float cfra = seq_prefetch_cfra(pfjob);
Sequence *seq_arr[MAXSEQ + 1];
int count = seq_get_shown_sequences(pfjob->scene_eval, channels, seqbase, cfra, 0, seq_arr);
blender::Vector<Sequence *> strips = seq_get_shown_sequences(
pfjob->scene_eval, channels, seqbase, cfra, 0);
/* Iterate over rendered strips. */
for (int i = 0; i < count; i++) {
Sequence *seq = seq_arr[i];
for (Sequence *seq : strips) {
if (seq->type == SEQ_TYPE_META &&
seq_prefetch_scene_strip_is_rendered(pfjob, channels, &seq->seqbase, scene_strips, true))
{

View File

@ -550,7 +550,6 @@ void SEQ_proxy_rebuild(SeqIndexBuildContext *context, wmJobWorkerStatus *worker_
render_context.view_id = context->view_id;
SeqRenderState state;
seq_render_state_init(&state);
for (timeline_frame = SEQ_time_left_handle_frame_get(scene, seq);
timeline_frame < SEQ_time_right_handle_frame_get(scene, seq);

View File

@ -1,11 +1,11 @@
/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
* SPDX-FileCopyrightText: 2003-2009 Blender Authors
* SPDX-FileCopyrightText: 2003-2024 Blender Authors
* SPDX-FileCopyrightText: 2005-2006 Peter Schlaile <peter [at] schlaile [dot] de>
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup bke
* \ingroup sequencer
*/
#include <ctime>
@ -75,6 +75,10 @@
#include "strip_time.hh"
#include "utils.hh"
#include <algorithm>
using namespace blender;
static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
SeqRenderState *state,
ListBase *channels,
@ -89,7 +93,7 @@ SequencerDrawView sequencer_view3d_fn = nullptr; /* nullptr in background mode *
/** \name Color-space utility functions
* \{ */
void seq_imbuf_assign_spaces(Scene *scene, ImBuf *ibuf)
void seq_imbuf_assign_spaces(const Scene *scene, ImBuf *ibuf)
{
#if 0
/* Byte buffer is supposed to be in sequencer working space already. */
@ -102,7 +106,7 @@ void seq_imbuf_assign_spaces(Scene *scene, ImBuf *ibuf)
}
}
void seq_imbuf_to_sequencer_space(Scene *scene, ImBuf *ibuf, bool make_float)
void seq_imbuf_to_sequencer_space(const Scene *scene, ImBuf *ibuf, bool make_float)
{
/* Early output check: if both buffers are nullptr we have nothing to convert. */
if (ibuf->float_buffer.data == nullptr && ibuf->byte_buffer.data == nullptr) {
@ -243,11 +247,6 @@ void SEQ_render_new_render_data(Main *bmain,
r_context->is_prefetch_render = false;
}
void seq_render_state_init(SeqRenderState *state)
{
state->scene_parents = nullptr;
}
StripElem *SEQ_render_give_stripelem(const Scene *scene, Sequence *seq, int timeline_frame)
{
StripElem *se = seq->strip->stripdata;
@ -268,39 +267,32 @@ StripElem *SEQ_render_give_stripelem(const Scene *scene, Sequence *seq, int time
return se;
}
static int seq_channel_cmp_fn(const void *a, const void *b)
Vector<Sequence *> seq_get_shown_sequences(const Scene *scene,
ListBase *channels,
ListBase *seqbase,
const int timeline_frame,
const int chanshown)
{
return (*(Sequence **)a)->machine - (*(Sequence **)b)->machine;
}
int seq_get_shown_sequences(const Scene *scene,
ListBase *channels,
ListBase *seqbase,
const int timeline_frame,
const int chanshown,
Sequence **r_seq_arr)
{
blender::VectorSet strips = SEQ_query_rendered_strips(
Vector<Sequence *> result;
VectorSet strips = SEQ_query_rendered_strips(
scene, channels, seqbase, timeline_frame, chanshown);
const int strip_count = strips.size();
if (UNLIKELY(strip_count > MAXSEQ)) {
BLI_assert_msg(0, "Too many strips, this shouldn't happen");
return 0;
return result;
}
/* Copy collection elements into array. */
memset(r_seq_arr, 0, sizeof(Sequence *) * (MAXSEQ + 1));
int index = 0;
result.reserve(strips.size());
for (Sequence *seq : strips) {
r_seq_arr[index] = seq;
index++;
result.append(seq);
}
/* Sort array by channel. */
qsort(r_seq_arr, strip_count, sizeof(Sequence *), seq_channel_cmp_fn);
return strip_count;
/* Sort strips by channel. */
std::sort(result.begin(), result.end(), [](const Sequence *a, const Sequence *b) {
return a->machine < b->machine;
});
return result;
}
/** \} */
@ -424,9 +416,9 @@ static void sequencer_image_crop_transform_matrix(const Sequence *seq,
float rotation_matrix[3][3];
axis_angle_to_mat3_single(rotation_matrix, 'Z', transform->rotation);
loc_rot_size_to_mat4(r_transform_matrix,
blender::float3{translate_x, translate_y, 0.0f},
float3{translate_x, translate_y, 0.0f},
rotation_matrix,
blender::float3{scale_x, scale_y, 1.0f});
float3{scale_x, scale_y, 1.0f});
transform_pivot_set_m4(r_transform_matrix, pivot);
invert_m4(r_transform_matrix);
}
@ -460,9 +452,9 @@ static void sequencer_thumbnail_transform(ImBuf *in, ImBuf *out)
float rotation_matrix[3][3];
unit_m3(rotation_matrix);
loc_rot_size_to_mat4(transform_matrix,
blender::float3{image_center_offs_x, image_center_offs_y, 0.0f},
float3{image_center_offs_x, image_center_offs_y, 0.0f},
rotation_matrix,
blender::float3{scale_x, scale_y, 1.0f});
float3{scale_x, scale_y, 1.0f});
transform_pivot_set_m4(transform_matrix, pivot);
invert_m4(transform_matrix);
IMB_transform(
@ -483,25 +475,25 @@ static bool seq_image_transform_transparency_gained(const SeqRenderData *context
float seq_image_quad[4][2];
SEQ_image_transform_final_quad_get(scene, seq, seq_image_quad);
for (int i = 0; i < 4; i++) {
add_v2_v2(seq_image_quad[i], blender::float2{x / 2.0f, y / 2.0f});
add_v2_v2(seq_image_quad[i], float2{x / 2.0f, y / 2.0f});
}
return !isect_point_quad_v2(blender::float2{float(x), float(y)},
return !isect_point_quad_v2(float2{float(x), float(y)},
seq_image_quad[0],
seq_image_quad[1],
seq_image_quad[2],
seq_image_quad[3]) ||
!isect_point_quad_v2(blender::float2{0, float(y)},
!isect_point_quad_v2(float2{0, float(y)},
seq_image_quad[0],
seq_image_quad[1],
seq_image_quad[2],
seq_image_quad[3]) ||
!isect_point_quad_v2(blender::float2{float(x), 0},
!isect_point_quad_v2(float2{float(x), 0},
seq_image_quad[0],
seq_image_quad[1],
seq_image_quad[2],
seq_image_quad[3]) ||
!isect_point_quad_v2(blender::float2{0, 0},
!isect_point_quad_v2(float2{0, 0},
seq_image_quad[0],
seq_image_quad[1],
seq_image_quad[2],
@ -805,7 +797,6 @@ static ImBuf *seq_render_effect_strip_impl(const SeqRenderData *context,
{
Scene *scene = context->scene;
float fac;
int early_out;
int i;
SeqEffectHandle sh = SEQ_effect_handle_get(seq);
FCurve *fcu = nullptr;
@ -838,13 +829,13 @@ static ImBuf *seq_render_effect_strip_impl(const SeqRenderData *context,
}
}
early_out = sh.early_out(seq, fac);
StripEarlyOut early_out = sh.early_out(seq, fac);
switch (early_out) {
case EARLY_NO_INPUT:
case StripEarlyOut::NoInput:
out = sh.execute(context, seq, timeline_frame, fac, nullptr, nullptr, nullptr);
break;
case EARLY_DO_EFFECT:
case StripEarlyOut::DoEffect:
for (i = 0; i < 3; i++) {
/* Speed effect requires time remapping of `timeline_frame` for input(s). */
if (input[0] && seq->type == SEQ_TYPE_SPEED) {
@ -868,12 +859,12 @@ static ImBuf *seq_render_effect_strip_impl(const SeqRenderData *context,
}
}
break;
case EARLY_USE_INPUT_1:
case StripEarlyOut::UseInput1:
if (input[0]) {
out = seq_render_strip(context, state, input[0], timeline_frame);
}
break;
case EARLY_USE_INPUT_2:
case StripEarlyOut::UseInput2:
if (input[1]) {
out = seq_render_strip(context, state, input[1], timeline_frame);
}
@ -1820,22 +1811,22 @@ static bool seq_must_swap_input_in_blend_mode(Sequence *seq)
return swap_input;
}
static int seq_get_early_out_for_blend_mode(Sequence *seq)
static StripEarlyOut seq_get_early_out_for_blend_mode(Sequence *seq)
{
SeqEffectHandle sh = seq_effect_get_sequence_blend(seq);
float fac = seq->blend_opacity / 100.0f;
int early_out = sh.early_out(seq, fac);
StripEarlyOut early_out = sh.early_out(seq, fac);
if (ELEM(early_out, EARLY_DO_EFFECT, EARLY_NO_INPUT)) {
if (ELEM(early_out, StripEarlyOut::DoEffect, StripEarlyOut::NoInput)) {
return early_out;
}
if (seq_must_swap_input_in_blend_mode(seq)) {
if (early_out == EARLY_USE_INPUT_2) {
return EARLY_USE_INPUT_1;
if (early_out == StripEarlyOut::UseInput2) {
return StripEarlyOut::UseInput1;
}
if (early_out == EARLY_USE_INPUT_1) {
return EARLY_USE_INPUT_2;
if (early_out == StripEarlyOut::UseInput1) {
return StripEarlyOut::UseInput2;
}
}
return early_out;
@ -1878,21 +1869,16 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
float timeline_frame,
int chanshown)
{
Sequence *seq_arr[MAXSEQ + 1];
int count;
int i;
ImBuf *out = nullptr;
count = seq_get_shown_sequences(
context->scene, channels, seqbasep, timeline_frame, chanshown, seq_arr);
if (count == 0) {
Vector<Sequence *> strips = seq_get_shown_sequences(
context->scene, channels, seqbasep, timeline_frame, chanshown);
if (strips.is_empty()) {
return nullptr;
}
for (i = count - 1; i >= 0; i--) {
int early_out;
Sequence *seq = seq_arr[i];
int64_t i;
ImBuf *out = nullptr;
for (i = strips.size() - 1; i >= 0; i--) {
Sequence *seq = strips[i];
out = seq_cache_get(context, seq, timeline_frame, SEQ_CACHE_STORE_COMPOSITE);
@ -1904,33 +1890,33 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
break;
}
early_out = seq_get_early_out_for_blend_mode(seq);
StripEarlyOut early_out = seq_get_early_out_for_blend_mode(seq);
/* Early out for alpha over. It requires image to be rendered, so it can't use
* `seq_get_early_out_for_blend_mode`. */
if (out == nullptr && seq->blend_mode == SEQ_TYPE_ALPHAOVER && seq->blend_opacity == 100.0f) {
ImBuf *test = seq_render_strip(context, state, seq, timeline_frame);
if (ELEM(test->planes, R_IMF_PLANES_BW, R_IMF_PLANES_RGB)) {
early_out = EARLY_USE_INPUT_2;
early_out = StripEarlyOut::UseInput2;
}
else {
early_out = EARLY_DO_EFFECT;
early_out = StripEarlyOut::DoEffect;
}
/* Free the image. It is stored in cache, so this doesn't affect performance. */
IMB_freeImBuf(test);
}
switch (early_out) {
case EARLY_NO_INPUT:
case EARLY_USE_INPUT_2:
case StripEarlyOut::NoInput:
case StripEarlyOut::UseInput2:
out = seq_render_strip(context, state, seq, timeline_frame);
break;
case EARLY_USE_INPUT_1:
case StripEarlyOut::UseInput1:
if (i == 0) {
out = IMB_allocImBuf(context->rectx, context->recty, 32, IB_rect);
}
break;
case EARLY_DO_EFFECT:
case StripEarlyOut::DoEffect:
if (i == 0) {
ImBuf *ibuf1 = IMB_allocImBuf(context->rectx, context->recty, 32, IB_rect);
ImBuf *ibuf2 = seq_render_strip(context, state, seq, timeline_frame);
@ -1938,7 +1924,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
out = seq_render_strip_stack_apply_effect(context, seq, timeline_frame, ibuf1, ibuf2);
IMB_metadata_copy(out, ibuf2);
seq_cache_put(context, seq_arr[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out);
seq_cache_put(context, strips[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out);
IMB_freeImBuf(ibuf1);
IMB_freeImBuf(ibuf2);
@ -1952,10 +1938,10 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
}
i++;
for (; i < count; i++) {
Sequence *seq = seq_arr[i];
for (; i < strips.size(); i++) {
Sequence *seq = strips[i];
if (seq_get_early_out_for_blend_mode(seq) == EARLY_DO_EFFECT) {
if (seq_get_early_out_for_blend_mode(seq) == StripEarlyOut::DoEffect) {
ImBuf *ibuf1 = out;
ImBuf *ibuf2 = seq_render_strip(context, state, seq, timeline_frame);
@ -1965,7 +1951,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context,
IMB_freeImBuf(ibuf2);
}
seq_cache_put(context, seq_arr[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out);
seq_cache_put(context, strips[i], timeline_frame, SEQ_CACHE_STORE_COMPOSITE, out);
}
return out;
@ -1994,31 +1980,29 @@ ImBuf *SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame,
}
SeqRenderState state;
seq_render_state_init(&state);
ImBuf *out = nullptr;
Sequence *seq_arr[MAXSEQ + 1];
int count;
count = seq_get_shown_sequences(scene, channels, seqbasep, timeline_frame, chanshown, seq_arr);
Vector<Sequence *> strips = seq_get_shown_sequences(
scene, channels, seqbasep, timeline_frame, chanshown);
if (count) {
out = seq_cache_get(context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT);
if (!strips.is_empty()) {
out = seq_cache_get(context, strips.last(), timeline_frame, SEQ_CACHE_STORE_FINAL_OUT);
}
seq_cache_free_temp_cache(context->scene, context->task_id, timeline_frame);
/* Make sure we only keep the `anim` data for strips that are in view. */
SEQ_relations_free_all_anim_ibufs(context->scene, timeline_frame);
if (count && !out) {
if (!strips.is_empty() && !out) {
BLI_mutex_lock(&seq_render_mutex);
out = seq_render_strip_stack(context, &state, channels, seqbasep, timeline_frame, chanshown);
if (context->is_prefetch_render) {
seq_cache_put(context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out);
seq_cache_put(context, strips.last(), timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out);
}
else {
seq_cache_put_if_possible(
context, seq_arr[count - 1], timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out);
context, strips.last(), timeline_frame, SEQ_CACHE_STORE_FINAL_OUT, out);
}
BLI_mutex_unlock(&seq_render_mutex);
}
@ -2035,7 +2019,6 @@ ImBuf *seq_render_give_ibuf_seqbase(const SeqRenderData *context,
ListBase *seqbasep)
{
SeqRenderState state;
seq_render_state_init(&state);
return seq_render_strip_stack(context, &state, channels, seqbasep, timeline_frame, chan_shown);
}
@ -2045,7 +2028,6 @@ ImBuf *SEQ_render_give_ibuf_direct(const SeqRenderData *context,
Sequence *seq)
{
SeqRenderState state;
seq_render_state_init(&state);
ImBuf *ibuf = seq_render_strip(context, &state, seq, timeline_frame);
return ibuf;
@ -2150,7 +2132,6 @@ void SEQ_render_thumbnails(const SeqRenderData *context,
const bool *stop)
{
SeqRenderState state;
seq_render_state_init(&state);
const Scene *scene = context->scene;
/* Adding the hold offset value (seq->anim_startofs) to the start frame. Position of image not
@ -2211,7 +2192,6 @@ void SEQ_render_thumbnails_base_set(const SeqRenderData *context,
const bool *stop)
{
SeqRenderState state;
seq_render_state_init(&state);
const Scene *scene = context->scene;
int timeline_frame = SEQ_time_left_handle_frame_get(scene, seq);

View File

@ -8,6 +8,8 @@
* \ingroup sequencer
*/
#include "BLI_vector.hh"
struct ImBuf;
struct LinkNode;
struct ListBase;
@ -16,18 +18,11 @@ struct SeqEffectHandle;
struct SeqRenderData;
struct Sequence;
#define EARLY_NO_INPUT -1
#define EARLY_DO_EFFECT 0
#define EARLY_USE_INPUT_1 1
#define EARLY_USE_INPUT_2 2
/* mutable state for sequencer */
struct SeqRenderState {
LinkNode *scene_parents;
LinkNode *scene_parents = nullptr;
};
void seq_render_state_init(SeqRenderState *state);
ImBuf *seq_render_give_ibuf_seqbase(const SeqRenderData *context,
float timeline_frame,
int chan_shown,
@ -41,13 +36,9 @@ ImBuf *seq_render_effect_execute_threaded(SeqEffectHandle *sh,
ImBuf *ibuf1,
ImBuf *ibuf2,
ImBuf *ibuf3);
void seq_imbuf_to_sequencer_space(Scene *scene, ImBuf *ibuf, bool make_float);
int seq_get_shown_sequences(const Scene *scene,
ListBase *channels,
ListBase *seqbase,
int timeline_frame,
int chanshown,
Sequence **r_seq_arr);
void seq_imbuf_to_sequencer_space(const Scene *scene, ImBuf *ibuf, bool make_float);
blender::Vector<Sequence *> seq_get_shown_sequences(
const Scene *scene, ListBase *channels, ListBase *seqbase, int timeline_frame, int chanshown);
ImBuf *seq_render_strip(const SeqRenderData *context,
SeqRenderState *state,
Sequence *seq,
@ -56,4 +47,4 @@ ImBuf *seq_render_mask(const SeqRenderData *context,
Mask *mask,
float frame_index,
bool make_float);
void seq_imbuf_assign_spaces(Scene *scene, ImBuf *ibuf);
void seq_imbuf_assign_spaces(const Scene *scene, ImBuf *ibuf);