mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 12:15:19 +00:00
kateenc: Refactoring for readability and leak fixing
Instead of a massive if/else/if/else/if/else/...: * Use a common cleanup path for allocated items just before leaving the function (which will be free-d only if we're not dealing with a delayed SPU). * "goto" that cleanup path wherever needed CID #1427096 CID #1427114
This commit is contained in:
parent
568c552ac0
commit
c755ad5032
1 changed files with 92 additions and 87 deletions
|
@ -780,6 +780,8 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||
kate_palette *kpalette;
|
||||
GstFlowReturn rflow;
|
||||
int ret = 0;
|
||||
GstClockTime start, stop;
|
||||
kate_float t0, t1;
|
||||
|
||||
/* allocate region, bitmap, and palette, in case we have to delay encoding them */
|
||||
kregion = (kate_region *) g_malloc (sizeof (kate_region));
|
||||
|
@ -810,22 +812,21 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
g_free (kregion);
|
||||
g_free (kbitmap);
|
||||
g_free (kpalette);
|
||||
goto beach;
|
||||
}
|
||||
|
||||
} else if (G_UNLIKELY (kbitmap->width == 0 || kbitmap->height == 0)) {
|
||||
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 !!!!?! */
|
||||
GST_WARNING_OBJECT (ke, "SPU is totally invisible - dimwits");
|
||||
rflow = GST_FLOW_OK;
|
||||
} else {
|
||||
goto beach;
|
||||
}
|
||||
|
||||
/* timestamp offsets are hidden in the SPU packets */
|
||||
GstClockTime start =
|
||||
GST_BUFFER_TIMESTAMP (buf) + GST_KATE_STM_TO_GST (ke->show_time);
|
||||
GstClockTime stop =
|
||||
GST_BUFFER_TIMESTAMP (buf) + GST_KATE_STM_TO_GST (ke->hide_time);
|
||||
kate_float t0 = start / (double) GST_SECOND;
|
||||
kate_float t1 = stop / (double) GST_SECOND;
|
||||
start = GST_BUFFER_TIMESTAMP (buf) + GST_KATE_STM_TO_GST (ke->show_time);
|
||||
stop = GST_BUFFER_TIMESTAMP (buf) + GST_KATE_STM_TO_GST (ke->hide_time);
|
||||
t0 = start / (double) GST_SECOND;
|
||||
t1 = stop / (double) GST_SECOND;
|
||||
GST_DEBUG_OBJECT (ke, "buf ts %f, start/show %hu/%hu",
|
||||
GST_BUFFER_TIMESTAMP (buf) / (double) GST_SECOND, ke->show_time,
|
||||
ke->hide_time);
|
||||
|
@ -852,22 +853,23 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||
if (G_UNLIKELY (ret < 0)) {
|
||||
GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL),
|
||||
("Failed to set region: %s", gst_kate_util_get_error_message (ret)));
|
||||
rflow = GST_FLOW_ERROR;
|
||||
} else {
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
ret = kate_encode_set_palette (&ke->k, kpalette);
|
||||
if (G_UNLIKELY (ret < 0)) {
|
||||
GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL),
|
||||
("Failed to set palette: %s",
|
||||
gst_kate_util_get_error_message (ret)));
|
||||
rflow = GST_FLOW_ERROR;
|
||||
} else {
|
||||
("Failed to set palette: %s", gst_kate_util_get_error_message (ret)));
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
ret = kate_encode_set_bitmap (&ke->k, kbitmap);
|
||||
if (G_UNLIKELY (ret < 0)) {
|
||||
GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL),
|
||||
("Failed to set bitmap: %s",
|
||||
gst_kate_util_get_error_message (ret)));
|
||||
rflow = GST_FLOW_ERROR;
|
||||
} else {
|
||||
("Failed to set bitmap: %s", gst_kate_util_get_error_message (ret)));
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
/* Some SPUs have no hide time - so I'm going to delay the encoding of the packet
|
||||
till either a suitable event happens, and the time of this event will be used
|
||||
as the end time of this SPU, which will then be encoded and sent off. Suitable
|
||||
|
@ -883,23 +885,21 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||
ke->delayed_palette = kpalette;
|
||||
ke->delayed_region = kregion;
|
||||
rflow = GST_FLOW_OK;
|
||||
} else {
|
||||
goto beach;
|
||||
}
|
||||
|
||||
ret = kate_encode_text (&ke->k, t0, t1, "", 0, &kp);
|
||||
if (G_UNLIKELY (ret < 0)) {
|
||||
GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL),
|
||||
("Failed to encode empty text for SPU buffer: %s",
|
||||
gst_kate_util_get_error_message (ret)));
|
||||
rflow = GST_FLOW_ERROR;
|
||||
} else {
|
||||
rflow =
|
||||
gst_kate_enc_chain_push_packet (ke, &kp, start,
|
||||
stop - start + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
rflow = gst_kate_enc_chain_push_packet (ke, &kp, start, stop - start + 1);
|
||||
|
||||
beach:
|
||||
/* Cleanup data if we're not keeping it around */
|
||||
if (!ke->delayed_spu) {
|
||||
g_free (kpalette->colors);
|
||||
g_free (kpalette);
|
||||
|
@ -907,9 +907,14 @@ gst_kate_enc_chain_spu (GstKateEnc * ke, GstBuffer * buf)
|
|||
g_free (kbitmap);
|
||||
g_free (kregion);
|
||||
}
|
||||
}
|
||||
|
||||
return rflow;
|
||||
|
||||
error_return:
|
||||
{
|
||||
rflow = GST_FLOW_ERROR;
|
||||
goto beach;
|
||||
}
|
||||
}
|
||||
|
||||
static GstFlowReturn
|
||||
|
|
Loading…
Reference in a new issue