Commit af08d9ae authored by Anton Khirnov's avatar Anton Khirnov

lavc: add avcodec_is_open().

It allows to check whether an AVCodecContext is open in a documented
way. Right now the undocumented way this check is done in lavf/lavc is
by checking whether AVCodecContext.codec is NULL. However it's desirable
to be able to set AVCodecContext.codec before avcodec_open2().
parent f7fe41a0
...@@ -13,6 +13,9 @@ libavutil: 2011-04-18 ...@@ -13,6 +13,9 @@ libavutil: 2011-04-18
API changes, most recent first: API changes, most recent first:
2012-01-31 - xxxxxxx - lavc 54.01.0
Add avcodec_is_open() function.
2012-01-30 - xxxxxxx - lavu 51.22.0 - intfloat.h 2012-01-30 - xxxxxxx - lavu 51.22.0 - intfloat.h
Add a new installed header libavutil/intfloat.h with int/float punning Add a new installed header libavutil/intfloat.h with int/float punning
functions. functions.
......
...@@ -4183,4 +4183,10 @@ enum AVMediaType avcodec_get_type(enum CodecID codec_id); ...@@ -4183,4 +4183,10 @@ enum AVMediaType avcodec_get_type(enum CodecID codec_id);
*/ */
const AVClass *avcodec_get_class(void); const AVClass *avcodec_get_class(void);
/**
* @return a positive value if s is open (i.e. avcodec_open2() was called on it
* with no corresponding avcodec_close()), 0 otherwise.
*/
int avcodec_is_open(AVCodecContext *s);
#endif /* AVCODEC_AVCODEC_H */ #endif /* AVCODEC_AVCODEC_H */
...@@ -485,7 +485,7 @@ AVCodecContext *avcodec_alloc_context3(AVCodec *codec){ ...@@ -485,7 +485,7 @@ AVCodecContext *avcodec_alloc_context3(AVCodec *codec){
int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src) int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
{ {
if (dest->codec) { // check that the dest context is uninitialized if (avcodec_is_open(dest)) { // check that the dest context is uninitialized
av_log(dest, AV_LOG_ERROR, av_log(dest, AV_LOG_ERROR,
"Tried to copy AVCodecContext %p into already-initialized %p\n", "Tried to copy AVCodecContext %p into already-initialized %p\n",
src, dest); src, dest);
......
...@@ -627,6 +627,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD ...@@ -627,6 +627,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
int ret = 0; int ret = 0;
AVDictionary *tmp = NULL; AVDictionary *tmp = NULL;
if (avcodec_is_open(avctx))
return 0;
if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE) if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE)
return AVERROR(EINVAL); return AVERROR(EINVAL);
...@@ -1803,3 +1806,8 @@ enum AVMediaType avcodec_get_type(enum CodecID codec_id) ...@@ -1803,3 +1806,8 @@ enum AVMediaType avcodec_get_type(enum CodecID codec_id)
return AVMEDIA_TYPE_UNKNOWN; return AVMEDIA_TYPE_UNKNOWN;
} }
int avcodec_is_open(AVCodecContext *s)
{
return !!s->internal;
}
...@@ -2006,7 +2006,7 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option ...@@ -2006,7 +2006,7 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option
AVFrame picture; AVFrame picture;
AVPacket pkt = *avpkt; AVPacket pkt = *avpkt;
if(!st->codec->codec){ if (!avcodec_is_open(st->codec)) {
AVDictionary *thread_opt = NULL; AVDictionary *thread_opt = NULL;
codec = avcodec_find_decoder(st->codec->codec_id); codec = avcodec_find_decoder(st->codec->codec_id);
...@@ -2354,7 +2354,6 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) ...@@ -2354,7 +2354,6 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
// close codecs which were opened in try_decode_frame() // close codecs which were opened in try_decode_frame()
for(i=0;i<ic->nb_streams;i++) { for(i=0;i<ic->nb_streams;i++) {
st = ic->streams[i]; st = ic->streams[i];
if(st->codec->codec)
avcodec_close(st->codec); avcodec_close(st->codec);
} }
for(i=0;i<ic->nb_streams;i++) { for(i=0;i<ic->nb_streams;i++) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment