summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-03-19 00:15:17 +0100
committerwm4 <wm4@nowhere>2013-03-29 22:58:31 +0100
commit35a62a5e6025c6807e1bdf86dd9abbc6fea74808 (patch)
treed73799c2a71f4d86aba847f9ffcd7d4a47f4f14b
parent5c9efa109eb9027334b730a42471ee1ec2ed4c9a (diff)
downloadlibass-35a62a5e6025c6807e1bdf86dd9abbc6fea74808.tar.bz2
libass-35a62a5e6025c6807e1bdf86dd9abbc6fea74808.tar.xz
Don't overwrite user-defined aspect ratio settings
ass_set_storage_size() overwrote the user-defined aspect ratio set with ass_set_aspect_ratio(). Change it so that if ass_set_aspect_ratio() is used, the ass_set_storage_size() parameters are not used for any aspect ratio calculations. (The storage size is still used for calculating the blur scale.) This simplifies the code as well, because the aspect ratio is now centrally calculated in ass_start_frame(). Update the doxygen. Make it clear that ass_set_storage_size() will be used for aspect ratio calculation, unless ass_set_aspect_ratio() is used. Also mention what libass actually does with the dar and sar parameters: it uses them to calculate a pixel aspect ratio, nothing else. Explicitly allow resetting the storage size with w=h=0. Document that it's allowed to remove the user defined aspect ratio by setting a pixel aspedct ratio of 0. See issue 6.
-rw-r--r--libass/ass.h13
-rw-r--r--libass/ass_render.c15
-rw-r--r--libass/ass_render.h3
-rw-r--r--libass/ass_render_api.c16
4 files changed, 28 insertions, 19 deletions
diff --git a/libass/ass.h b/libass/ass.h
index bd32458..1e662ba 100644
--- a/libass/ass.h
+++ b/libass/ass.h
@@ -167,8 +167,11 @@ void ass_renderer_done(ASS_Renderer *priv);
void ass_set_frame_size(ASS_Renderer *priv, int w, int h);
/**
- * \brief Set the source image size in pixels. The source aspect ratio
- * is automatically reset to the value corresponding to this image size.
+ * \brief Set the source image size in pixels.
+ * This is used to calculate the source aspect ratio and the blur scale. If
+ * a custom pixel aspect ratio is set with ass_set_aspect_ratio(), the source
+ * image size has no influence on the aspect ratio.
+ * The source image size can be reset to default by setting w and h to 0.
* \param priv renderer handle
* \param w width
* \param h height
@@ -202,6 +205,12 @@ void ass_set_use_margins(ASS_Renderer *priv, int use);
/**
* \brief Set aspect ratio parameters.
+ * You can also pass a pixel aspect ratio as dar, and set sar to 1.0. libass
+ * uses dar/sar as final pixel aspect ratio, and doesn't use dar or sar for
+ * anything else. If the pixel aspect ratio is 0 (setting dar=0 and sar=1), or
+ * if the aspect ratio has never been set by calling this function, libass will
+ * calculate a fallback value out of frame size and storage size. If the
+ * storage size has not been set, a pixel aspect ratio of 1 is assumed.
* \param priv renderer handle
* \param dar display aspect ratio (DAR), prescaled for output PAR
* \param sar storage aspect ratio (SAR)
diff --git a/libass/ass_render.c b/libass/ass_render.c
index de27641..67ecb9c 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -2264,8 +2264,19 @@ ass_start_frame(ASS_Renderer *render_priv, ASS_Track *track,
ass_shaper_set_level(render_priv->shaper, render_priv->settings.shaper);
// PAR correction
- render_priv->font_scale_x = render_priv->settings.aspect /
- render_priv->settings.storage_aspect;
+ double par = render_priv->settings.par;
+ if (par == 0.) {
+ if (settings_priv->frame_width && settings_priv->frame_height &&
+ settings_priv->storage_width && settings_priv->storage_height) {
+ double dar = ((double) settings_priv->frame_width) /
+ settings_priv->frame_height;
+ double sar = ((double) settings_priv->storage_width) /
+ settings_priv->storage_height;
+ par = sar / dar;
+ } else
+ par = 1.0;
+ }
+ render_priv->font_scale_x = par;
render_priv->prev_images_root = render_priv->images_root;
render_priv->images_root = 0;
diff --git a/libass/ass_render.h b/libass/ass_render.h
index 53343fd..ecfca61 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -79,8 +79,7 @@ typedef struct {
int right_margin;
int use_margins; // 0 - place all subtitles inside original frame
// 1 - use margins for placing toptitles and subtitles
- double aspect; // frame aspect ratio, d_width / d_height.
- double storage_aspect; // pixel ratio of the source image
+ double par; // user defined pixel aspect ratio (0 = unset)
ASS_Hinting hinting;
ASS_ShapingLevel shaper;
diff --git a/libass/ass_render_api.c b/libass/ass_render_api.c
index babc442..80af81f 100644
--- a/libass/ass_render_api.c
+++ b/libass/ass_render_api.c
@@ -57,26 +57,16 @@ void ass_set_frame_size(ASS_Renderer *priv, int w, int h)
if (priv->settings.frame_width != w || priv->settings.frame_height != h) {
priv->settings.frame_width = w;
priv->settings.frame_height = h;
- if (priv->settings.aspect == 0.)
- priv->settings.aspect = ((double) w) / h;
- if (priv->settings.storage_aspect == 0.)
- priv->settings.storage_aspect = ((double) w) / h;
ass_reconfigure(priv);
}
}
void ass_set_storage_size(ASS_Renderer *priv, int w, int h)
{
- if (!w || !h) {
- ass_msg(priv->library, MSGL_WARN,
- "ass_set_storage_size: ignoring zero storage dimensions");
- return;
- }
if (priv->settings.storage_width != w ||
priv->settings.storage_height != h) {
priv->settings.storage_width = w;
priv->settings.storage_height = h;
- priv->settings.storage_aspect = ((double) w) / h;
ass_reconfigure(priv);
}
}
@@ -111,9 +101,9 @@ void ass_set_use_margins(ASS_Renderer *priv, int use)
void ass_set_aspect_ratio(ASS_Renderer *priv, double dar, double sar)
{
- if (priv->settings.aspect != dar || priv->settings.storage_aspect != sar) {
- priv->settings.aspect = dar;
- priv->settings.storage_aspect = sar;
+ double par = dar / sar;
+ if (priv->settings.par != par) {
+ priv->settings.par = par;
ass_reconfigure(priv);
}
}