summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/APIchanges4
-rw-r--r--ffplay.c13
-rw-r--r--libavcodec/avcodec.h13
-rw-r--r--libavcodec/utils.c20
4 files changed, 36 insertions, 14 deletions
diff --git a/doc/APIchanges b/doc/APIchanges
index 43b8788c48..fe0789d25a 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -12,6 +12,10 @@ libavutil: 2009-03-08
API changes, most recent first:
+2010-07-11 - r24185 - lavc 52.82.0 - avsubtitle_free()
+ Add a function for free the contents of a AVSubtitle generated by
+ avcodec_decode_subtitle.
+
2010-07-08 - r24101 - lavu 50.21.0 - pixdesc.h
Rename read/write_line() to av_read/write_image_line().
diff --git a/ffplay.c b/ffplay.c
index c32b10a5a1..4f254dfc8c 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -677,18 +677,7 @@ static void blend_subrect(AVPicture *dst, const AVSubtitleRect *rect, int imgw,
static void free_subpicture(SubPicture *sp)
{
- int i;
-
- for (i = 0; i < sp->sub.num_rects; i++)
- {
- av_freep(&sp->sub.rects[i]->pict.data[0]);
- av_freep(&sp->sub.rects[i]->pict.data[1]);
- av_freep(&sp->sub.rects[i]);
- }
-
- av_free(sp->sub.rects);
-
- memset(&sp->sub, 0, sizeof(AVSubtitle));
+ avsubtitle_free(&sp->sub);
}
static void video_image_display(VideoState *is)
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 05c96e8e56..475d9b5f03 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -30,7 +30,7 @@
#include "libavutil/avutil.h"
#define LIBAVCODEC_VERSION_MAJOR 52
-#define LIBAVCODEC_VERSION_MINOR 81
+#define LIBAVCODEC_VERSION_MINOR 82
#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
@@ -3548,13 +3548,22 @@ attribute_deprecated int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtit
* due to a potentially very different allocation pattern.
*
* @param avctx the codec context
- * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored.
+ * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored, must be
+ freed with avsubtitle_free if *got_sub_ptr is set.
* @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
* @param[in] avpkt The input AVPacket containing the input buffer.
*/
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
int *got_sub_ptr,
AVPacket *avpkt);
+
+/**
+ * Frees all allocated data in the given subtitle struct.
+ *
+ * @param sub AVSubtitle to free.
+ */
+void avsubtitle_free(AVSubtitle *sub);
+
int avcodec_parse_frame(AVCodecContext *avctx, uint8_t **pdata,
int *data_size_ptr,
uint8_t *buf, int buf_size);
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index c3d701c74f..ced6b64c29 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -689,6 +689,26 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
return ret;
}
+void avsubtitle_free(AVSubtitle *sub)
+{
+ int i;
+
+ for (i = 0; i < sub->num_rects; i++)
+ {
+ av_freep(sub->rects[i]->pict.data[0]);
+ av_freep(sub->rects[i]->pict.data[1]);
+ av_freep(sub->rects[i]->pict.data[2]);
+ av_freep(sub->rects[i]->pict.data[3]);
+ av_freep(sub->rects[i]->text);
+ av_freep(sub->rects[i]->ass);
+ av_freep(sub->rects[i]);
+ }
+
+ av_freep(sub->rects);
+
+ memset(sub, 0, sizeof(AVSubtitle));
+}
+
av_cold int avcodec_close(AVCodecContext *avctx)
{
/* If there is a user-supplied mutex locking routine, call it. */