kateenc: keep bitmap/palette/region around when on the spot encoding is not possible due to an unknown end time
Fixes valgrind unitialized value report. See #525743.
This commit is contained in:
parent
2f7ec50899
commit
9db1323d31
@ -283,6 +283,9 @@ gst_kate_enc_init (GstKateEnc * ke, GstKateEncClass * gclass)
|
|||||||
memcpy (ke->spu_clut, gst_kate_enc_default_clut,
|
memcpy (ke->spu_clut, gst_kate_enc_default_clut,
|
||||||
sizeof (gst_kate_enc_default_clut));
|
sizeof (gst_kate_enc_default_clut));
|
||||||
ke->delayed_spu = FALSE;
|
ke->delayed_spu = FALSE;
|
||||||
|
ke->delayed_bitmap = NULL;
|
||||||
|
ke->delayed_palette = NULL;
|
||||||
|
ke->delayed_region = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1237,6 +1240,16 @@ gst_kate_enc_flush_waiting (GstKateEnc * ke, GstClockTime now)
|
|||||||
/* forget it even if we couldn't flush it */
|
/* forget it even if we couldn't flush it */
|
||||||
ke->delayed_spu = FALSE;
|
ke->delayed_spu = FALSE;
|
||||||
|
|
||||||
|
/* free the delayed data */
|
||||||
|
g_free (ke->delayed_bitmap->pixels);
|
||||||
|
g_free (ke->delayed_bitmap);
|
||||||
|
ke->delayed_bitmap = NULL;
|
||||||
|
g_free (ke->delayed_palette->colors);
|
||||||
|
g_free (ke->delayed_palette);
|
||||||
|
ke->delayed_palette = NULL;
|
||||||
|
g_free (ke->delayed_region);
|
||||||
|
ke->delayed_region = NULL;
|
||||||
|
|
||||||
/* now that we've flushed the packet, we want to insert keepalives as requested */
|
/* now that we've flushed the packet, we want to insert keepalives as requested */
|
||||||
if (ke->keepalive_min_time > 0.0f && t1 > t0) {
|
if (ke->keepalive_min_time > 0.0f && t1 > t0) {
|
||||||
GST_INFO_OBJECT (ke, "generating keepalives at %f from %f to %f",
|
GST_INFO_OBJECT (ke, "generating keepalives at %f from %f to %f",
|
||||||
@ -1256,13 +1269,28 @@ static GstFlowReturn
|
|||||||
gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
kate_packet kp;
|
kate_packet kp;
|
||||||
kate_region kregion;
|
kate_region *kregion;
|
||||||
kate_bitmap kbitmap;
|
kate_bitmap *kbitmap;
|
||||||
kate_palette kpalette;
|
kate_palette *kpalette;
|
||||||
GstFlowReturn rflow;
|
GstFlowReturn rflow;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
rflow = gst_kate_enc_decode_spu (ke, buf, &kregion, &kbitmap, &kpalette);
|
/* allocate region, bitmap, and palette, in case we have to delay encoding them */
|
||||||
|
kregion = (kate_region *) g_malloc (sizeof (kate_region));
|
||||||
|
kbitmap = (kate_bitmap *) g_malloc (sizeof (kate_bitmap));
|
||||||
|
kpalette = (kate_palette *) g_malloc (sizeof (kate_palette));
|
||||||
|
if (!kregion || !kpalette || !kbitmap) {
|
||||||
|
if (kregion)
|
||||||
|
g_free (kregion);
|
||||||
|
if (kbitmap)
|
||||||
|
g_free (kbitmap);
|
||||||
|
if (kpalette)
|
||||||
|
g_free (kpalette);
|
||||||
|
GST_ERROR_OBJECT (ke, "Out of memory");
|
||||||
|
return GST_FLOW_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
rflow = gst_kate_enc_decode_spu (ke, buf, kregion, kbitmap, kpalette);
|
||||||
if (G_UNLIKELY (rflow != GST_FLOW_OK)) {
|
if (G_UNLIKELY (rflow != GST_FLOW_OK)) {
|
||||||
GST_ERROR_OBJECT (ke, "Failed to decode incoming SPU");
|
GST_ERROR_OBJECT (ke, "Failed to decode incoming SPU");
|
||||||
#if 0
|
#if 0
|
||||||
@ -1279,7 +1307,7 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (G_UNLIKELY (kbitmap.width == 0 || kbitmap.height == 0)) {
|
} else if (G_UNLIKELY (kbitmap->width == 0 || kbitmap->height == 0)) {
|
||||||
/* there are some DVDs (well, at least one) where some dimwits put in a wholly transparent full screen 720x576 SPU !!!!?! */
|
/* there are some DVDs (well, at least one) where some dimwits put in a wholly transparent full screen 720x576 SPU !!!!?! */
|
||||||
GST_WARNING_OBJECT (ke, "SPU is totally invisible - dimwits");
|
GST_WARNING_OBJECT (ke, "SPU is totally invisible - dimwits");
|
||||||
rflow = GST_FLOW_OK;
|
rflow = GST_FLOW_OK;
|
||||||
@ -1310,18 +1338,18 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
GST_DEBUG_OBJECT (ke, "Encoding %dx%d SPU: (%u bytes) from %f to %f",
|
GST_DEBUG_OBJECT (ke, "Encoding %dx%d SPU: (%u bytes) from %f to %f",
|
||||||
kbitmap.width, kbitmap.height, GST_BUFFER_SIZE (buf), t0, t1);
|
kbitmap->width, kbitmap->height, GST_BUFFER_SIZE (buf), t0, t1);
|
||||||
ret = kate_encode_set_region (&ke->k, &kregion);
|
ret = kate_encode_set_region (&ke->k, kregion);
|
||||||
if (G_UNLIKELY (ret < 0)) {
|
if (G_UNLIKELY (ret < 0)) {
|
||||||
GST_WARNING_OBJECT (ke, "Failed to set event region (%d)", ret);
|
GST_WARNING_OBJECT (ke, "Failed to set event region (%d)", ret);
|
||||||
rflow = GST_FLOW_ERROR;
|
rflow = GST_FLOW_ERROR;
|
||||||
} else {
|
} else {
|
||||||
ret = kate_encode_set_palette (&ke->k, &kpalette);
|
ret = kate_encode_set_palette (&ke->k, kpalette);
|
||||||
if (G_UNLIKELY (ret < 0)) {
|
if (G_UNLIKELY (ret < 0)) {
|
||||||
GST_WARNING_OBJECT (ke, "Failed to set event palette (%d)", ret);
|
GST_WARNING_OBJECT (ke, "Failed to set event palette (%d)", ret);
|
||||||
rflow = GST_FLOW_ERROR;
|
rflow = GST_FLOW_ERROR;
|
||||||
} else {
|
} else {
|
||||||
ret = kate_encode_set_bitmap (&ke->k, &kbitmap);
|
ret = kate_encode_set_bitmap (&ke->k, kbitmap);
|
||||||
if (G_UNLIKELY (ret < 0)) {
|
if (G_UNLIKELY (ret < 0)) {
|
||||||
GST_WARNING_OBJECT (ke, "Failed to set event bitmap (%d)", ret);
|
GST_WARNING_OBJECT (ke, "Failed to set event bitmap (%d)", ret);
|
||||||
rflow = GST_FLOW_ERROR;
|
rflow = GST_FLOW_ERROR;
|
||||||
@ -1337,6 +1365,9 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||||||
t0);
|
t0);
|
||||||
ke->delayed_spu = TRUE;
|
ke->delayed_spu = TRUE;
|
||||||
ke->delayed_start = start;
|
ke->delayed_start = start;
|
||||||
|
ke->delayed_bitmap = kbitmap;
|
||||||
|
ke->delayed_palette = kpalette;
|
||||||
|
ke->delayed_region = kregion;
|
||||||
rflow = GST_FLOW_OK;
|
rflow = GST_FLOW_OK;
|
||||||
} else {
|
} else {
|
||||||
ret = kate_encode_text (&ke->k, t0, t1, "", 0, &kp);
|
ret = kate_encode_text (&ke->k, t0, t1, "", 0, &kp);
|
||||||
@ -1353,8 +1384,14 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_free (kpalette.colors);
|
|
||||||
g_free (kbitmap.pixels);
|
if (!ke->delayed_spu) {
|
||||||
|
g_free (kpalette->colors);
|
||||||
|
g_free (kpalette);
|
||||||
|
g_free (kbitmap->pixels);
|
||||||
|
g_free (kbitmap);
|
||||||
|
g_free (kregion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rflow;
|
return rflow;
|
||||||
|
@ -83,6 +83,9 @@ struct _GstKateEnc
|
|||||||
gboolean initialized;
|
gboolean initialized;
|
||||||
gboolean delayed_spu;
|
gboolean delayed_spu;
|
||||||
GstClockTime delayed_start;
|
GstClockTime delayed_start;
|
||||||
|
kate_bitmap *delayed_bitmap;
|
||||||
|
kate_palette *delayed_palette;
|
||||||
|
kate_region *delayed_region;
|
||||||
gchar *language;
|
gchar *language;
|
||||||
gchar *category;
|
gchar *category;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user