Avoid large amounts of data on the stack (> 900k on 64 bit systems).

Patch by Tobias Diedrich (ranma at tdiedrich de) with minor modifications by me.


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19213 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2006-07-28 13:50:08 +00:00
parent c3cdf1ced9
commit 615166ab61
1 changed files with 24 additions and 15 deletions

View File

@ -955,12 +955,12 @@ int kerning(font_desc_t *desc, int prevc, int c)
font_desc_t* read_font_desc_ft(const char *fname, int movie_width, int movie_height) font_desc_t* read_font_desc_ft(const char *fname, int movie_width, int movie_height)
{ {
font_desc_t *desc; font_desc_t *desc = NULL;
FT_Face face; FT_Face face;
FT_ULong my_charset[MAX_CHARSET_SIZE]; /* characters we want to render; Unicode */ FT_ULong *my_charset = malloc(MAX_CHARSET_SIZE * sizeof(FT_ULong)); /* characters we want to render; Unicode */
FT_ULong my_charcodes[MAX_CHARSET_SIZE]; /* character codes in 'encoding' */ FT_ULong *my_charcodes = malloc(MAX_CHARSET_SIZE * sizeof(FT_ULong)); /* character codes in 'encoding' */
char *charmap = "ucs-4"; char *charmap = "ucs-4";
int err; int err;
@ -973,6 +973,11 @@ font_desc_t* read_font_desc_ft(const char *fname, int movie_width, int movie_hei
float subtitle_font_ppem; float subtitle_font_ppem;
float osd_font_ppem; float osd_font_ppem;
if (my_charset == NULL || my_charcodes == NULL) {
mp_msg(MSGT_OSD, MSGL_ERR, "subtitle font: malloc failed.\n");
goto err_out;
}
switch (subtitle_autoscale) { switch (subtitle_autoscale) {
case 1: case 1:
movie_size = movie_height; movie_size = movie_height;
@ -1005,7 +1010,7 @@ font_desc_t* read_font_desc_ft(const char *fname, int movie_width, int movie_hei
} }
desc = init_font_desc(); desc = init_font_desc();
if(!desc) return NULL; if(!desc) goto err_out;
// t=GetTimer(); // t=GetTimer();
@ -1030,11 +1035,10 @@ font_desc_t* read_font_desc_ft(const char *fname, int movie_width, int movie_hei
if (charset_size < 0) { if (charset_size < 0) {
mp_msg(MSGT_OSD, MSGL_ERR, "subtitle font: prepare_charset failed.\n"); mp_msg(MSGT_OSD, MSGL_ERR, "subtitle font: prepare_charset failed.\n");
free_font_desc(desc); goto err_out;
return NULL;
} }
#else #else
return NULL; goto err_out;
#endif #endif
// fprintf(stderr, "fg: prepare t = %lf\n", GetTimer()-t); // fprintf(stderr, "fg: prepare t = %lf\n", GetTimer()-t);
@ -1045,8 +1049,7 @@ font_desc_t* read_font_desc_ft(const char *fname, int movie_width, int movie_hei
if (err) { if (err) {
mp_msg(MSGT_OSD, MSGL_ERR, "Cannot prepare subtitle font.\n"); mp_msg(MSGT_OSD, MSGL_ERR, "Cannot prepare subtitle font.\n");
free_font_desc(desc); goto err_out;
return NULL;
} }
gen_osd: gen_osd:
@ -1054,8 +1057,7 @@ gen_osd:
/* generate the OSD font */ /* generate the OSD font */
err = load_osd_face(&face); err = load_osd_face(&face);
if (err) { if (err) {
free_font_desc(desc); goto err_out;
return NULL;
} }
desc->face_cnt++; desc->face_cnt++;
@ -1065,16 +1067,14 @@ gen_osd:
if (err) { if (err) {
mp_msg(MSGT_OSD, MSGL_ERR, "Cannot prepare OSD font.\n"); mp_msg(MSGT_OSD, MSGL_ERR, "Cannot prepare OSD font.\n");
free_font_desc(desc); goto err_out;
return NULL;
} }
err = generate_tables(desc, subtitle_font_thickness, subtitle_font_radius); err = generate_tables(desc, subtitle_font_thickness, subtitle_font_radius);
if (err) { if (err) {
mp_msg(MSGT_OSD, MSGL_ERR, "Cannot generate tables.\n"); mp_msg(MSGT_OSD, MSGL_ERR, "Cannot generate tables.\n");
free_font_desc(desc); goto err_out;
return NULL;
} }
// final cleanup // final cleanup
@ -1092,7 +1092,16 @@ gen_osd:
desc->font[i] = desc->font[j]; desc->font[i] = desc->font[j];
} }
} }
free(my_charset);
free(my_charcodes);
return desc; return desc;
err_out:
if (desc)
free_font_desc(desc);
free(my_charset);
free(my_charcodes);
return NULL;
} }
int init_freetype(void) int init_freetype(void)