diff command.c @ 30345:ea015e0ab0c6

Also handle ASS subtitles when removing subtitles via sub_remove slave command. Fixes memory leaks and other strange behaviour like mismatch of name and subtitle data. Based on patch by Yuriy Kaminskiy [yumkam mail ru].
author reimar
date Fri, 22 Jan 2010 21:10:40 +0000
parents 4752e3cbe7be
children c1a3f1bbba26
line wrap: on
line diff
--- a/command.c	Fri Jan 22 20:59:15 2010 +0000
+++ b/command.c	Fri Jan 22 21:10:40 2010 +0000
@@ -2341,6 +2341,9 @@
     int end = start + count;
     int after = mpctx->set_of_sub_size - end;
     sub_data **subs = mpctx->set_of_subtitles;
+#ifdef CONFIG_ASS
+    ass_track_t **ass_tracks = mpctx->set_of_ass_tracks;
+#endif
     if (count < 0 || count > mpctx->set_of_sub_size ||
         start < 0 || start > mpctx->set_of_sub_size - count) {
         mp_msg(MSGT_CPLAYER, MSGL_ERR,
@@ -2354,6 +2357,11 @@
                filename_recode(subd->filename));
         sub_free(subd);
         subs[idx] = NULL;
+#ifdef CONFIG_ASS
+        if (ass_tracks[idx])
+            ass_free_track(ass_tracks[idx]);
+        ass_tracks[idx] = NULL;
+#endif
     }
 
     mpctx->global_sub_size -= count;
@@ -2363,10 +2371,17 @@
 
     memmove(subs + start, subs + end, after * sizeof(*subs));
     memset(subs + start + after, 0, count * sizeof(*subs));
+#ifdef CONFIG_ASS
+    memmove(ass_tracks + start, ass_tracks + end, after * sizeof(*ass_tracks));
+    memset(ass_tracks + start + after, 0, count * sizeof(*ass_tracks));
+#endif
 
     if (mpctx->set_of_sub_pos >= start && mpctx->set_of_sub_pos < end) {
         mpctx->global_sub_pos = -2;
         subdata = NULL;
+#ifdef CONFIG_ASS
+        ass_track = NULL;
+#endif
         mp_input_queue_cmd(mp_input_parse_cmd("sub_select"));
     } else if (mpctx->set_of_sub_pos >= end) {
         mpctx->set_of_sub_pos -= count;