--- doc/APIchanges | 5 +++ libavcodec/avcodec.h | 63 +++--------------------------- libavcodec/utils.c | 29 +++----------- libavcodec/version.h | 3 ++ libavutil/Makefile | 2 + libavutil/subtitle.c | 62 +++++++++++++++++++++++++++++ libavutil/subtitle.h | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 191 insertions(+), 80 deletions(-) create mode 100644 libavutil/subtitle.c create mode 100644 libavutil/subtitle.h
diff --git a/doc/APIchanges b/doc/APIchanges index ba7eae1..989794a 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,11 @@ libavutil: 2014-08-09 API changes, most recent first: +2014-12-xx - xxxxxxx - lavc 56.16.100 / lavu 54.17.100 - lavc/avcodec.h lavu/picture.h + Move AVSubtitle definition from libavcodec to libavutil and add + av_subtitle_*() functions which should be used instead of stack allocation + and the now deprecated avsubtitle_free(). + 2014-12-xx - xxxxxxx - lavc 56.15.100 / lavu 54.16.100 - lavc/avcodec.h lavu/picture.h Move AVPicture definition from libavcodec to libavutil. This should be transparent API and ABI wise. diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 2c1918d..6ded06b 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -40,6 +40,7 @@ #include "libavutil/picture.h" #include "libavutil/pixfmt.h" #include "libavutil/rational.h" +#include "libavutil/subtitle.h" #include "version.h" @@ -3149,8 +3150,6 @@ typedef struct AVProfile { typedef struct AVCodecDefault AVCodecDefault; -struct AVSubtitle; - /** * AVCodec. */ @@ -3401,61 +3400,6 @@ typedef struct AVHWAccel { * @} */ -enum AVSubtitleType { - SUBTITLE_NONE, - - SUBTITLE_BITMAP, ///< A bitmap, pict will be set - - /** - * Plain text, the text field must be set by the decoder and is - * authoritative. ass and pict fields may contain approximations. - */ - SUBTITLE_TEXT, - - /** - * Formatted text, the ass field must be set by the decoder and is - * authoritative. pict and text fields may contain approximations. - */ - SUBTITLE_ASS, -}; - -#define AV_SUBTITLE_FLAG_FORCED 0x00000001 - -typedef struct AVSubtitleRect { - int x; ///< top left corner of pict, undefined when pict is not set - int y; ///< top left corner of pict, undefined when pict is not set - int w; ///< width of pict, undefined when pict is not set - int h; ///< height of pict, undefined when pict is not set - int nb_colors; ///< number of colors in pict, undefined when pict is not set - - /** - * data+linesize for the bitmap of this subtitle. - * can be set for text/ass as well once they are rendered - */ - AVPicture pict; - enum AVSubtitleType type; - - char *text; ///< 0 terminated plain UTF-8 text - - /** - * 0 terminated ASS/SSA compatible event line. - * The presentation of this is unaffected by the other values in this - * struct. - */ - char *ass; - - int flags; -} AVSubtitleRect; - -typedef struct AVSubtitle { - uint16_t format; /* 0 = graphics */ - uint32_t start_display_time; /* relative to packet pts, in ms */ - uint32_t end_display_time; /* relative to packet pts, in ms */ - unsigned num_rects; - AVSubtitleRect **rects; - int64_t pts; ///< Same as packet pts, in AV_TIME_BASE -} AVSubtitle; - /** * If c is NULL, returns the first registered codec, * if c is non-NULL, returns the next registered codec after c, @@ -3652,12 +3596,17 @@ int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **op */ int avcodec_close(AVCodecContext *avctx); +#if FF_API_AVSUBTITLE /** * Free all allocated data in the given subtitle struct. + * @deprecated use av_subtitle_*() functions (the immediate equivalent of + * avsubtitle_free() is av_subtitle_clear()) * * @param sub AVSubtitle to free. */ +attribute_deprecated void avsubtitle_free(AVSubtitle *sub); +#endif /** * @} diff --git a/libavcodec/utils.c b/libavcodec/utils.c index db79b67..dc0c1ec 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -39,6 +39,7 @@ #include "libavutil/pixdesc.h" #include "libavutil/imgutils.h" #include "libavutil/samplefmt.h" +#include "libavutil/subtitle.h" #include "libavutil/dict.h" #include "avcodec.h" #include "libavutil/opt.h" @@ -1270,12 +1271,6 @@ int av_codec_get_max_lowres(const AVCodec *codec) return codec->max_lowres; } -static void get_subtitle_defaults(AVSubtitle *sub) -{ - memset(sub, 0, sizeof(*sub)); - sub->pts = AV_NOPTS_VALUE; -} - static int get_bit_rate(AVCodecContext *ctx) { int bit_rate; @@ -2706,7 +2701,7 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, } *got_sub_ptr = 0; - get_subtitle_defaults(sub); + av_subtitle_get_defaults(sub); if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) { AVPacket pkt_recoded; @@ -2750,7 +2745,7 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, av_log(avctx, AV_LOG_ERROR, "Invalid UTF-8 in decoded subtitles text; " "maybe missing -sub_charenc option\n"); - avsubtitle_free(sub); + av_subtitle_clear(sub); return AVERROR_INVALIDDATA; } } @@ -2782,24 +2777,12 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, return ret; } +#if FF_API_AVSUBTITLE 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_subtitle_clear(sub); } +#endif av_cold int avcodec_close(AVCodecContext *avctx) { diff --git a/libavcodec/version.h b/libavcodec/version.h index 6610e8c..7c611c5 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -184,5 +184,8 @@ #ifndef FF_API_MPV_OPT #define FF_API_MPV_OPT (LIBAVCODEC_VERSION_MAJOR < 59) #endif +#ifndef FF_API_AVSUBTITLE +#define FF_API_AVSUBTITLE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif #endif /* AVCODEC_VERSION_H */ diff --git a/libavutil/Makefile b/libavutil/Makefile index ad703db..2998b08 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -56,6 +56,7 @@ HEADERS = adler32.h \ sha.h \ sha512.h \ stereo3d.h \ + subtitle.h \ threadmessage.h \ time.h \ timecode.h \ @@ -124,6 +125,7 @@ OBJS = adler32.o \ sha.o \ sha512.o \ stereo3d.o \ + subtitle.o \ threadmessage.o \ time.o \ timecode.o \ diff --git a/libavutil/subtitle.c b/libavutil/subtitle.c new file mode 100644 index 0000000..25217af --- /dev/null +++ b/libavutil/subtitle.c @@ -0,0 +1,62 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "subtitle.h" + +void av_subtitle_get_defaults(AVSubtitle *sub) +{ + memset(sub, 0, sizeof(*sub)); + sub->pts = AV_NOPTS_VALUE; +} + +AVSubtitle *av_subtitle_alloc(void) +{ + AVSubtitle *sub = av_mallocz(sizeof(*sub)); + + if (!sub) + return NULL; + av_subtitle_get_defaults(sub); + return sub; +} + +void av_subtitle_clear(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)); +} + +void av_subtitle_free(AVSubtitle **sub) +{ + if (!sub || !*sub) + return; + av_subtitle_clear(*sub); + av_freep(sub); +} diff --git a/libavutil/subtitle.h b/libavutil/subtitle.h new file mode 100644 index 0000000..6d205cd --- /dev/null +++ b/libavutil/subtitle.h @@ -0,0 +1,107 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_SUBTITLE_H +#define AVUTIL_SUBTITLE_H + +#include <stdint.h> + +#include "picture.h" + +enum AVSubtitleType { + SUBTITLE_NONE, + + SUBTITLE_BITMAP, ///< A bitmap, pict will be set + + /** + * Plain text, the text field must be set by the decoder and is + * authoritative. ass and pict fields may contain approximations. + */ + SUBTITLE_TEXT, + + /** + * Formatted text, the ass field must be set by the decoder and is + * authoritative. pict and text fields may contain approximations. + */ + SUBTITLE_ASS, +}; + +#define AV_SUBTITLE_FLAG_FORCED 0x00000001 + +typedef struct AVSubtitleRect { + int x; ///< top left corner of pict, undefined when pict is not set + int y; ///< top left corner of pict, undefined when pict is not set + int w; ///< width of pict, undefined when pict is not set + int h; ///< height of pict, undefined when pict is not set + int nb_colors; ///< number of colors in pict, undefined when pict is not set + + /** + * data+linesize for the bitmap of this subtitle. + * can be set for text/ass as well once they are rendered + */ + AVPicture pict; + enum AVSubtitleType type; + + char *text; ///< 0 terminated plain UTF-8 text + + /** + * 0 terminated ASS/SSA compatible event line. + * The presentation of this is unaffected by the other values in this + * struct. + */ + char *ass; + + int flags; +} AVSubtitleRect; + +typedef struct AVSubtitle { + uint16_t format; /* 0 = graphics */ + uint32_t start_display_time; /* relative to packet pts, in ms */ + uint32_t end_display_time; /* relative to packet pts, in ms */ + unsigned num_rects; + AVSubtitleRect **rects; + int64_t pts; ///< Same as packet pts, in AV_TIME_BASE +} AVSubtitle; + +/** + * Allocate an AVSubtitle and set its fields to default values. The resulting + * struct must be freed using av_subtitle_free(). + * + * @return An AVSubtitle filled with default values or NULL on failure. + */ +AVSubtitle *av_subtitle_alloc(void); + +/** + * Reset all the fields to their defaults. This is not useful for most users. + */ +void av_subtitle_get_defaults(AVSubtitle *sub); + +/** + * Free any dynamically allocated objects in the specified AVSubtitle, e.g. + * rects. + */ +void av_subtitle_clear(AVSubtitle *sub); + +/** + * Call av_subtitle_clear() and free the subtitle. + * + * @param sub subtitle to be freed. The pointer will be set to NULL. + */ +void av_subtitle_free(AVSubtitle **sub); + +#endif -- 2.1.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel