sub: cleanup: don't pass parameters via global variables

Passing parameters from caller to subtitle renderer was done by
temporarily setting certain members in the osd_state struct (which for
all practical purposes are as good as global variables). This was the
only purpose of these members.

Rather than using such a messy way to pass parameter, put these into a
struct sub_render_params. The struct was already introduced in earlier
commits, and this commit just removes the parameter passing hack.
This commit is contained in:
wm4 2012-10-04 17:16:36 +02:00
parent 17f5019b46
commit 05f4f00e24
7 changed files with 36 additions and 40 deletions

View File

@ -45,7 +45,7 @@ void sub_init(struct sh_sub *sh, struct osd_state *osd)
if (sh->sd_driver->init(sh, osd) < 0)
return;
osd->sh_sub = sh;
osd->bitmap_id = ++osd->bitmap_pos_id;
osd->switch_sub_id++;
sh->initialized = true;
sh->active = true;
}
@ -58,14 +58,15 @@ void sub_decode(struct sh_sub *sh, struct osd_state *osd, void *data,
sh->sd_driver->decode(sh, osd, data, data_len, pts, duration);
}
void sub_get_bitmaps(struct osd_state *osd, struct sub_bitmaps *res)
void sub_get_bitmaps(struct osd_state *osd, struct sub_render_params *params,
struct sub_bitmaps *res)
{
struct MPOpts *opts = osd->opts;
*res = (struct sub_bitmaps){ .render_index = 0,
.format = SUBBITMAP_EMPTY,
.bitmap_id = osd->bitmap_id,
.bitmap_pos_id = osd->bitmap_pos_id };
// temporary hack
osd->support_rgba = params->support_rgba;
*res = (struct sub_bitmaps) {0};
if (!opts->sub_visibility || !osd->sh_sub || !osd->sh_sub->active) {
/* Change ID in case we just switched from visible subtitles
* to current state. Hopefully, unnecessarily claiming that
@ -73,14 +74,15 @@ void sub_get_bitmaps(struct osd_state *osd, struct sub_bitmaps *res)
* Increase osd-> values ahead so that _next_ returned id
* is also guaranteed to differ from this one.
*/
res->bitmap_id = ++res->bitmap_pos_id;
osd->bitmap_id = osd->bitmap_pos_id += 2;
return;
osd->switch_sub_id++;
} else {
if (osd->sh_sub->sd_driver->get_bitmaps)
osd->sh_sub->sd_driver->get_bitmaps(osd->sh_sub, osd, params, res);
}
if (osd->sh_sub->sd_driver->get_bitmaps)
osd->sh_sub->sd_driver->get_bitmaps(osd->sh_sub, osd, res);
osd->bitmap_id = res->bitmap_id;
osd->bitmap_pos_id = res->bitmap_pos_id;
res->bitmap_id += osd->switch_sub_id;
res->bitmap_pos_id += osd->switch_sub_id;
osd->switch_sub_id = 0;
}
void sub_reset(struct sh_sub *sh, struct osd_state *osd)

View File

@ -76,7 +76,8 @@ static inline bool is_text_sub(int type)
void sub_decode(struct sh_sub *sh, struct osd_state *osd, void *data,
int data_len, double pts, double duration);
void sub_get_bitmaps(struct osd_state *osd, struct sub_bitmaps *res);
void sub_get_bitmaps(struct osd_state *osd, struct sub_render_params *params,
struct sub_bitmaps *res);
void sub_init(struct sh_sub *sh, struct osd_state *osd);
void sub_reset(struct sh_sub *sh, struct osd_state *osd);
void sub_switchoff(struct sh_sub *sh, struct osd_state *osd);

View File

@ -2,6 +2,7 @@
#define MPLAYER_SD_H
struct osd_state;
struct sub_render_params;
struct sh_sub;
struct sub_bitmaps;
@ -10,6 +11,7 @@ struct sd_functions {
void (*decode)(struct sh_sub *sh, struct osd_state *osd,
void *data, int data_len, double pts, double duration);
void (*get_bitmaps)(struct sh_sub *sh, struct osd_state *osd,
struct sub_render_params *params,
struct sub_bitmaps *res);
void (*reset)(struct sh_sub *sh, struct osd_state *osd);
void (*switch_off)(struct sh_sub *sh, struct osd_state *osd);

View File

@ -127,21 +127,22 @@ static void decode(struct sh_sub *sh, struct osd_state *osd, void *data,
}
static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
struct sub_render_params *params,
struct sub_bitmaps *res)
{
struct sd_ass_priv *ctx = sh->context;
struct MPOpts *opts = osd->opts;
if (osd->sub_pts == MP_NOPTS_VALUE)
if (params->pts == MP_NOPTS_VALUE)
return;
double scale = osd->normal_scale;
double scale = params->normal_scale;
if (ctx->vsfilter_aspect && opts->ass_vsfilter_aspect_compat)
scale = osd->vsfilter_scale;
scale = params->vsfilter_scale;
ASS_Renderer *renderer = osd->ass_renderer;
mp_ass_configure(renderer, opts, &osd->dim);
mp_ass_configure(renderer, opts, &params->dim);
ass_set_aspect_ratio(renderer, scale, 1);
mp_ass_render_frame(renderer, ctx->ass_track, osd->sub_pts * 1000 + .5,
mp_ass_render_frame(renderer, ctx->ass_track, params->pts * 1000 + .5,
&ctx->parts, res);
talloc_steal(ctx, ctx->parts);
}

View File

@ -220,14 +220,15 @@ static void decode(struct sh_sub *sh, struct osd_state *osd, void *data,
}
static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
struct sub_render_params *params,
struct sub_bitmaps *res)
{
struct sd_lavc_priv *priv = sh->context;
if (priv->endpts != MP_NOPTS_VALUE && (osd->sub_pts >= priv->endpts ||
osd->sub_pts < priv->endpts - 300))
if (priv->endpts != MP_NOPTS_VALUE && (params->pts >= priv->endpts ||
params->pts < priv->endpts - 300))
clear(priv);
if (!osd->support_rgba)
if (!params->support_rgba)
return;
if (priv->bitmaps_changed && priv->count > 0)
priv->outbitmaps = talloc_memdup(priv, priv->inbitmaps,
@ -236,7 +237,7 @@ static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
int inw = priv->avctx->width;
int inh = priv->avctx->height;
guess_resolution(sh->type, &inw, &inh);
struct mp_eosd_res *d = &osd->dim;
struct mp_eosd_res *d = &params->dim;
double xscale = (double) (d->w - d->ml - d->mr) / inw;
double yscale = (double) (d->h - d->mt - d->mb) / inh;
for (int i = 0; i < priv->count; i++) {

View File

@ -178,18 +178,13 @@ static bool render_object(struct osd_state *osd, struct osd_object *obj,
out_imgs->bitmap_pos_id++;
}
} else if (obj->type == OSDTYPE_SUB) {
double pts = sub_params->pts;
if (pts != MP_NOPTS_VALUE)
pts += sub_delay - osd->sub_offset;
struct sub_render_params p = *sub_params;
if (p.pts != MP_NOPTS_VALUE)
p.pts += sub_delay - osd->sub_offset;
// passing the parameters is a big temporary hack
osd->sub_pts = pts;
osd->dim = sub_params->dim;
osd->normal_scale = sub_params->normal_scale;
osd->vsfilter_scale = sub_params->vsfilter_scale;
osd->support_rgba = formats[SUBBITMAP_RGBA];
p.support_rgba = formats[SUBBITMAP_RGBA];
sub_get_bitmaps(osd, out_imgs);
sub_get_bitmaps(osd, &p, out_imgs);
} else {
osd_object_get_bitmaps(osd, obj, out_imgs);
}

View File

@ -67,10 +67,6 @@ struct osd_state {
double sub_offset;
double vo_sub_pts;
double sub_pts;
struct mp_eosd_res dim;
double normal_scale;
double vsfilter_scale;
bool support_rgba;
bool render_subs_in_filter;
@ -80,9 +76,7 @@ struct osd_state {
char *osd_text; // OSDTYPE_OSD
int progbar_type, progbar_value; // OSDTYPE_PROGBAR
// temporary for sub decoders
int bitmap_id;
int bitmap_pos_id;
int switch_sub_id;
struct MPOpts *opts;