summaryrefslogtreecommitdiff
path: root/src/internal/subtitle/renderers
diff options
context:
space:
mode:
authorTuomas Virtanen <katajakasa@gmail.com>2018-07-02 00:57:10 +0300
committerTuomas Virtanen <katajakasa@gmail.com>2018-07-02 00:57:10 +0300
commit2c7242e8f88d180876d1f693aa0ca998c6467766 (patch)
treed241de0ba1d6b4ab761abe8ac36315c7a5320400 /src/internal/subtitle/renderers
parent406491cf0378a02d0188e2d3c92518d571db82f1 (diff)
Reduce memory usage of subtitles
Diffstat (limited to 'src/internal/subtitle/renderers')
-rw-r--r--src/internal/subtitle/renderers/kitsubass.c5
-rw-r--r--src/internal/subtitle/renderers/kitsubimage.c9
-rw-r--r--src/internal/subtitle/renderers/kitsubrenderer.c4
3 files changed, 11 insertions, 7 deletions
diff --git a/src/internal/subtitle/renderers/kitsubass.c b/src/internal/subtitle/renderers/kitsubass.c
index afac077..7db72dd 100644
--- a/src/internal/subtitle/renderers/kitsubass.c
+++ b/src/internal/subtitle/renderers/kitsubass.c
@@ -67,7 +67,7 @@ static void ren_close_ass_cb(Kit_SubtitleRenderer *ren) {
free(ass_ren);
}
-static int ren_get_ass_data_cb(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atlas, double current_pts) {
+static int ren_get_ass_data_cb(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atlas, SDL_Texture *texture, double current_pts) {
Kit_ASSSubtitleRenderer *ass_ren = ren->userdata;
SDL_Surface *dst = NULL;
ASS_Image *src = NULL;
@@ -86,6 +86,7 @@ static int ren_get_ass_data_cb(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atla
// There was some change, process images and add them to atlas
Kit_ClearAtlasContent(atlas);
+ Kit_CheckAtlasTextureSize(atlas, texture);
for(; src; src = src->next) {
if(src->w == 0 || src->h == 0)
continue;
@@ -96,7 +97,7 @@ static int ren_get_ass_data_cb(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atla
target.y = src->dst_y;
target.w = dst->w;
target.h = dst->h;
- Kit_AddAtlasItem(atlas, dst, &target);
+ Kit_AddAtlasItem(atlas, texture, dst, &target);
SDL_FreeSurface(dst);
}
diff --git a/src/internal/subtitle/renderers/kitsubimage.c b/src/internal/subtitle/renderers/kitsubimage.c
index 890a829..0cd0cce 100644
--- a/src/internal/subtitle/renderers/kitsubimage.c
+++ b/src/internal/subtitle/renderers/kitsubimage.c
@@ -57,17 +57,20 @@ static void ren_render_image_cb(Kit_SubtitleRenderer *ren, void *sub_src, double
}
}
-static int ren_get_img_data_cb(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atlas, double current_pts) {
+static int ren_get_img_data_cb(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atlas, SDL_Texture *texture, double current_pts) {
Kit_ImageSubtitleRenderer *img_ren = ren->userdata;
Kit_SubtitlePacket *packet = NULL;
- // Clean dead packets
+ Kit_CheckAtlasTextureSize(atlas, texture);
while((packet = Kit_PeekDecoderOutput(ren->dec)) != NULL) {
+ // Clear dead packets
if(packet->pts_end < current_pts) {
Kit_AdvanceDecoderOutput(ren->dec);
Kit_FreeSubtitlePacket(packet);
continue;
}
+
+ // Show visible ones
if(packet->pts_start < current_pts) {
if(packet->clear) {
Kit_ClearAtlasContent(atlas);
@@ -78,7 +81,7 @@ static int ren_get_img_data_cb(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atla
target.y = packet->y * img_ren->scale_y;
target.w = packet->surface->w * img_ren->scale_x;
target.h = packet->surface->h * img_ren->scale_y;
- Kit_AddAtlasItem(atlas, packet->surface, &target);
+ Kit_AddAtlasItem(atlas, texture, packet->surface, &target);
}
Kit_AdvanceDecoderOutput(ren->dec);
Kit_FreeSubtitlePacket(packet);
diff --git a/src/internal/subtitle/renderers/kitsubrenderer.c b/src/internal/subtitle/renderers/kitsubrenderer.c
index f998899..77ad201 100644
--- a/src/internal/subtitle/renderers/kitsubrenderer.c
+++ b/src/internal/subtitle/renderers/kitsubrenderer.c
@@ -24,11 +24,11 @@ void Kit_RunSubtitleRenderer(Kit_SubtitleRenderer *ren, void *src, double start_
ren->ren_render(ren, src, start_pts, end_pts);
}
-int Kit_GetSubtitleRendererData(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atlas, double current_pts) {
+int Kit_GetSubtitleRendererData(Kit_SubtitleRenderer *ren, Kit_TextureAtlas *atlas, SDL_Texture *texture, double current_pts) {
if(ren == NULL)
return 0;
if(ren->ren_get_data != NULL)
- return ren->ren_get_data(ren, atlas, current_pts);
+ return ren->ren_get_data(ren, atlas, texture, current_pts);
return 0;
}