Browse Source

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.
tags/n2.0
Clément Bœsch 12 years ago
parent
commit
160979f4b4
1 changed files with 13 additions and 7 deletions
  1. +13
    -7
      libavcodec/utils.c

+ 13
- 7
libavcodec/utils.c View File

@@ -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) if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_AUTOMATIC)
avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_PRE_DECODER; 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 " av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
"conversion needs a libavcodec built with iconv support " "conversion needs a libavcodec built with iconv support "
"for this codec\n"); "for this codec\n");
ret = AVERROR(ENOSYS); ret = AVERROR(ENOSYS);
goto free_and_end; goto free_and_end;
#endif
} }
} }
} }
@@ -1899,12 +1910,7 @@ static int recode_subtitle(AVCodecContext *avctx,


#if CONFIG_ICONV #if CONFIG_ICONV
cd = iconv_open("UTF-8", avctx->sub_charenc); 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; inb = inpkt->data;
inl = inpkt->size; inl = inpkt->size;


Loading…
Cancel
Save