diff options
author | Tuomas Virtanen <katajakasa@gmail.com> | 2018-07-02 00:57:10 +0300 |
---|---|---|
committer | Tuomas Virtanen <katajakasa@gmail.com> | 2018-07-02 00:57:10 +0300 |
commit | 2c7242e8f88d180876d1f693aa0ca998c6467766 (patch) | |
tree | d241de0ba1d6b4ab761abe8ac36315c7a5320400 /src/internal/subtitle/renderers | |
parent | 406491cf0378a02d0188e2d3c92518d571db82f1 (diff) |
Reduce memory usage of subtitles
Diffstat (limited to 'src/internal/subtitle/renderers')
-rw-r--r-- | src/internal/subtitle/renderers/kitsubass.c | 5 | ||||
-rw-r--r-- | src/internal/subtitle/renderers/kitsubimage.c | 9 | ||||
-rw-r--r-- | src/internal/subtitle/renderers/kitsubrenderer.c | 4 |
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;
}
|