mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2025-10-14 13:04:21 +08:00
avcodec/avcodec: Perform sub_charenc/iconv checks before AVCodec.init()
Also move them to ff_decode_preinit(). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
@@ -36,9 +36,6 @@
|
|||||||
#include "frame_thread_encoder.h"
|
#include "frame_thread_encoder.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#if CONFIG_ICONV
|
|
||||||
# include <iconv.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "libavutil/ffversion.h"
|
#include "libavutil/ffversion.h"
|
||||||
const char av_codec_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
|
const char av_codec_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
|
||||||
@@ -385,43 +382,6 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
|
|||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
goto free_and_end;
|
goto free_and_end;
|
||||||
}
|
}
|
||||||
if (avctx->sub_charenc) {
|
|
||||||
if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
|
|
||||||
"supported with subtitles codecs\n");
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
goto free_and_end;
|
|
||||||
} else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
|
|
||||||
av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
|
|
||||||
"subtitles character encoding will be ignored\n",
|
|
||||||
avctx->codec_descriptor->name);
|
|
||||||
avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_DO_NOTHING;
|
|
||||||
} else {
|
|
||||||
/* input character encoding is set for a text based subtitle
|
|
||||||
* codec at this point */
|
|
||||||
if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_AUTOMATIC)
|
|
||||||
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) {
|
|
||||||
ret = AVERROR(errno);
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
|
|
||||||
"with input character encoding \"%s\"\n", avctx->sub_charenc);
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if FF_API_AVCTX_TIMEBASE
|
#if FF_API_AVCTX_TIMEBASE
|
||||||
if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
|
if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
|
||||||
|
@@ -2031,6 +2031,41 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||||||
avctx->codec->max_lowres);
|
avctx->codec->max_lowres);
|
||||||
avctx->lowres = avctx->codec->max_lowres;
|
avctx->lowres = avctx->codec->max_lowres;
|
||||||
}
|
}
|
||||||
|
if (avctx->sub_charenc) {
|
||||||
|
if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
|
||||||
|
"supported with subtitles codecs\n");
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
} else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
|
||||||
|
av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
|
||||||
|
"subtitles character encoding will be ignored\n",
|
||||||
|
avctx->codec_descriptor->name);
|
||||||
|
avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_DO_NOTHING;
|
||||||
|
} else {
|
||||||
|
/* input character encoding is set for a text based subtitle
|
||||||
|
* codec at this point */
|
||||||
|
if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_AUTOMATIC)
|
||||||
|
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) {
|
||||||
|
ret = AVERROR(errno);
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
|
||||||
|
"with input character encoding \"%s\"\n", avctx->sub_charenc);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
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");
|
||||||
|
return AVERROR(ENOSYS);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
avctx->pts_correction_num_faulty_pts =
|
avctx->pts_correction_num_faulty_pts =
|
||||||
avctx->pts_correction_num_faulty_dts = 0;
|
avctx->pts_correction_num_faulty_dts = 0;
|
||||||
|
Reference in New Issue
Block a user