|
|
|
@ -114,17 +114,34 @@ char *ff_ass_get_dialog(int readorder, int layer, const char *style, |
|
|
|
|
speaker ? speaker : "", text); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, |
|
|
|
|
int ff_ass_add_rect2(AVSubtitle *sub, const char *dialog, |
|
|
|
|
int readorder, int layer, const char *style, |
|
|
|
|
const char *speaker) |
|
|
|
|
const char *speaker, unsigned *nb_rect_allocated) |
|
|
|
|
{ |
|
|
|
|
AVSubtitleRect **rects, *rect; |
|
|
|
|
AVSubtitleRect **rects = sub->rects, *rect; |
|
|
|
|
char *ass_str; |
|
|
|
|
uint64_t new_nb = 0; |
|
|
|
|
|
|
|
|
|
rects = av_realloc_array(sub->rects, sub->num_rects+1, sizeof(*sub->rects)); |
|
|
|
|
if (!rects) |
|
|
|
|
if (sub->num_rects >= UINT_MAX) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
sub->rects = rects; |
|
|
|
|
|
|
|
|
|
if (nb_rect_allocated && *nb_rect_allocated <= sub->num_rects) { |
|
|
|
|
if (sub->num_rects < UINT_MAX / 17 * 16) { |
|
|
|
|
new_nb = sub->num_rects + sub->num_rects/16 + 1; |
|
|
|
|
} else |
|
|
|
|
new_nb = UINT_MAX; |
|
|
|
|
} else if (!nb_rect_allocated) |
|
|
|
|
new_nb = sub->num_rects + 1; |
|
|
|
|
|
|
|
|
|
if (new_nb) { |
|
|
|
|
rects = av_realloc_array(rects, new_nb, sizeof(*sub->rects)); |
|
|
|
|
if (!rects) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
if (nb_rect_allocated) |
|
|
|
|
*nb_rect_allocated = new_nb; |
|
|
|
|
sub->rects = rects; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rect = av_mallocz(sizeof(*rect)); |
|
|
|
|
if (!rect) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
@ -137,6 +154,13 @@ int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_ass_add_rect(AVSubtitle *sub, const char *dialog, |
|
|
|
|
int readorder, int layer, const char *style, |
|
|
|
|
const char *speaker) |
|
|
|
|
{ |
|
|
|
|
return ff_ass_add_rect2(sub, dialog, readorder, layer, style, speaker, NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ff_ass_decoder_flush(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
FFASSDecoderContext *s = avctx->priv_data; |
|
|
|
|