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().
This commit is contained in:
parent
f7fe41a04f
commit
af08d9aeea
@ -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);
|
|||||||
*/
|
*/
|
||||||
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){
|
|||||||
|
|
||||||
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
|
|||||||
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)
|
|||||||
|
|
||||||
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
|
|||||||
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)
|
|||||||
// 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++) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user