summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Bœsch <ubitux@gmail.com>2013-03-08 20:38:01 +0100
committerClément Bœsch <ubitux@gmail.com>2013-03-08 20:51:57 +0100
commit160979f4b4cd06833a7a5c7fa8794e7a05095bce (patch)
tree9385ec59b789b9f211d5e61893b6b59ab7211749
parent307dc32a1a7152ebacdcf9a0e58226f786ac639a (diff)
lavc/utils: make sure the iconv descriptor can be opened only once.
This prevents trying to do some subtitles conversion for each event when the character encoding is not found. It now aborts early instead of flooding stderr.
-rw-r--r--libavcodec/utils.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index ffa46b677d..befb94896b 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1106,12 +1106,23 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_AUTOMATIC)
avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_PRE_DECODER;
- if (!CONFIG_ICONV && avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_PRE_DECODER) {
+ if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_PRE_DECODER) {
+#if CONFIG_ICONV
+ iconv_t cd = iconv_open("UTF-8", avctx->sub_charenc);
+ if (cd == (iconv_t)-1) {
+ av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
+ "with input character encoding \"%s\"\n", avctx->sub_charenc);
+ ret = AVERROR(errno);
+ goto free_and_end;
+ }
+ iconv_close(cd);
+#else
av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
"conversion needs a libavcodec built with iconv support "
"for this codec\n");
ret = AVERROR(ENOSYS);
goto free_and_end;
+#endif
}
}
}
@@ -1899,12 +1910,7 @@ static int recode_subtitle(AVCodecContext *avctx,
#if CONFIG_ICONV
cd = iconv_open("UTF-8", avctx->sub_charenc);
- if (cd == (iconv_t)-1) {
- av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
- "with input character encoding \"%s\"\n", avctx->sub_charenc);
- ret = AVERROR(errno);
- goto end;
- }
+ av_assert0(cd != (iconv_t)-1);
inb = inpkt->data;
inl = inpkt->size;