Merge remote-tracking branch 'qatar/release/0.7' into release/0.8
* qatar/release/0.7: Add a version bump and APIchanges entry for avcodec_open2 and avformat_find_stream_info. lavf: fix multiplication overflow in avformat_find_stream_info() lavf: fix invalid reads in avformat_find_stream_info() lavf: add avformat_find_stream_info() lavc: fix parentheses placement in avcodec_open2(). lavc: introduce avcodec_open2() as a replacement for avcodec_open(). Conflicts: doc/APIchanges libavcodec/utils.c libavcodec/version.h libavformat/avformat.h libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
14d4eee547
@ -13,6 +13,7 @@ libavutil: 2011-04-18
|
|||||||
|
|
||||||
API changes, most recent first:
|
API changes, most recent first:
|
||||||
|
|
||||||
|
|
||||||
2011-06-19 - xxxxxxx - lavfi 2.23.0 - avfilter.h
|
2011-06-19 - xxxxxxx - lavfi 2.23.0 - avfilter.h
|
||||||
Add layout negotiation fields and helper functions.
|
Add layout negotiation fields and helper functions.
|
||||||
|
|
||||||
@ -43,6 +44,12 @@ API changes, most recent first:
|
|||||||
2011-06-12 - xxxxxxx - lavfi 2.16.0 - avfilter_graph_parse()
|
2011-06-12 - xxxxxxx - lavfi 2.16.0 - avfilter_graph_parse()
|
||||||
Change avfilter_graph_parse() signature.
|
Change avfilter_graph_parse() signature.
|
||||||
|
|
||||||
|
2011-07-10 - xxxxxxx - lavf 53.3.0
|
||||||
|
Add avformat_find_stream_info(), deprecate av_find_stream_info().
|
||||||
|
|
||||||
|
2011-07-10 - xxxxxxx - lavc 53.6.0
|
||||||
|
Add avcodec_open2(), deprecate avcodec_open().
|
||||||
|
|
||||||
2011-06-xx - xxxxxxx - lavf 53.2.0 - avformat.h
|
2011-06-xx - xxxxxxx - lavf 53.2.0 - avformat.h
|
||||||
Add avformat_open_input and avformat_write_header().
|
Add avformat_open_input and avformat_write_header().
|
||||||
Deprecate av_open_input_stream, av_open_input_file,
|
Deprecate av_open_input_stream, av_open_input_file,
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "libavutil/samplefmt.h"
|
#include "libavutil/samplefmt.h"
|
||||||
#include "libavutil/avutil.h"
|
#include "libavutil/avutil.h"
|
||||||
#include "libavutil/cpu.h"
|
#include "libavutil/cpu.h"
|
||||||
|
#include "libavutil/dict.h"
|
||||||
|
|
||||||
#include "libavcodec/version.h"
|
#include "libavcodec/version.h"
|
||||||
|
|
||||||
@ -3683,6 +3684,7 @@ int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, v
|
|||||||
int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
|
int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
|
||||||
//FIXME func typedef
|
//FIXME func typedef
|
||||||
|
|
||||||
|
#if FF_API_AVCODEC_OPEN
|
||||||
/**
|
/**
|
||||||
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this
|
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this
|
||||||
* function the context has to be allocated.
|
* function the context has to be allocated.
|
||||||
@ -3709,8 +3711,44 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2,
|
|||||||
* @param codec The codec to use within the context.
|
* @param codec The codec to use within the context.
|
||||||
* @return zero on success, a negative value on error
|
* @return zero on success, a negative value on error
|
||||||
* @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close
|
* @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close
|
||||||
|
*
|
||||||
|
* @deprecated use avcodec_open2
|
||||||
*/
|
*/
|
||||||
int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
|
int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this
|
||||||
|
* function the context has to be allocated with avcodec_alloc_context().
|
||||||
|
*
|
||||||
|
* The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
|
||||||
|
* avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
|
||||||
|
* retrieving a codec.
|
||||||
|
*
|
||||||
|
* @warning This function is not thread safe!
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* avcodec_register_all();
|
||||||
|
* av_dict_set(&opts, "b", "2.5M", 0);
|
||||||
|
* codec = avcodec_find_decoder(CODEC_ID_H264);
|
||||||
|
* if (!codec)
|
||||||
|
* exit(1);
|
||||||
|
*
|
||||||
|
* context = avcodec_alloc_context();
|
||||||
|
*
|
||||||
|
* if (avcodec_open(context, codec, opts) < 0)
|
||||||
|
* exit(1);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param avctx The context to initialize.
|
||||||
|
* @param options A dictionary filled with AVCodecContext and codec-private options.
|
||||||
|
* On return this object will be filled with options that were not found.
|
||||||
|
*
|
||||||
|
* @return zero on success, a negative value on error
|
||||||
|
* @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
|
||||||
|
* av_dict_set(), av_opt_find().
|
||||||
|
*/
|
||||||
|
int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode the audio frame of size avpkt->size from avpkt->data into samples.
|
* Decode the audio frame of size avpkt->size from avpkt->data into samples.
|
||||||
|
@ -973,7 +973,7 @@ static int estimate_best_b_count(MpegEncContext *s){
|
|||||||
c->time_base= s->avctx->time_base;
|
c->time_base= s->avctx->time_base;
|
||||||
c->max_b_frames= s->max_b_frames;
|
c->max_b_frames= s->max_b_frames;
|
||||||
|
|
||||||
if (avcodec_open(c, codec) < 0)
|
if (avcodec_open2(c, codec, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for(i=0; i<s->max_b_frames+2; i++){
|
for(i=0; i<s->max_b_frames+2; i++){
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "libavutil/audioconvert.h"
|
#include "libavutil/audioconvert.h"
|
||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
#include "libavutil/samplefmt.h"
|
#include "libavutil/samplefmt.h"
|
||||||
|
#include "libavutil/dict.h"
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
@ -485,9 +486,20 @@ static void avcodec_get_subtitle_defaults(AVSubtitle *sub)
|
|||||||
sub->pts = AV_NOPTS_VALUE;
|
sub->pts = AV_NOPTS_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if FF_API_AVCODEC_OPEN
|
||||||
int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
||||||
|
{
|
||||||
|
return avcodec_open2(avctx, codec, NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
AVDictionary *tmp = NULL;
|
||||||
|
|
||||||
|
if (options)
|
||||||
|
av_dict_copy(&tmp, *options, 0);
|
||||||
|
|
||||||
/* If there is a user-supplied mutex locking routine, call it. */
|
/* If there is a user-supplied mutex locking routine, call it. */
|
||||||
if (ff_lockmgr_cb) {
|
if (ff_lockmgr_cb) {
|
||||||
@ -514,14 +526,18 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
|||||||
ret = AVERROR(ENOMEM);
|
ret = AVERROR(ENOMEM);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if(codec->priv_class){ //this can be droped once all user apps use avcodec_get_context_defaults3()
|
if (codec->priv_class) {
|
||||||
*(AVClass**)avctx->priv_data= codec->priv_class;
|
*(AVClass**)avctx->priv_data= codec->priv_class;
|
||||||
av_opt_set_defaults(avctx->priv_data);
|
av_opt_set_defaults(avctx->priv_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (codec->priv_class && (ret = av_opt_set_dict(avctx->priv_data, &tmp)) < 0)
|
||||||
|
goto free_and_end;
|
||||||
} else {
|
} else {
|
||||||
avctx->priv_data = NULL;
|
avctx->priv_data = NULL;
|
||||||
}
|
}
|
||||||
|
if ((ret = av_opt_set_dict(avctx, &tmp)) < 0)
|
||||||
|
goto free_and_end;
|
||||||
|
|
||||||
if(avctx->coded_width && avctx->coded_height)
|
if(avctx->coded_width && avctx->coded_height)
|
||||||
avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
|
avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
|
||||||
@ -640,8 +656,14 @@ end:
|
|||||||
if (ff_lockmgr_cb) {
|
if (ff_lockmgr_cb) {
|
||||||
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
|
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
|
||||||
}
|
}
|
||||||
|
if (options) {
|
||||||
|
av_dict_free(options);
|
||||||
|
*options = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
free_and_end:
|
free_and_end:
|
||||||
|
av_dict_free(&tmp);
|
||||||
av_freep(&avctx->priv_data);
|
av_freep(&avctx->priv_data);
|
||||||
avctx->codec= NULL;
|
avctx->codec= NULL;
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#define AVCODEC_VERSION_H
|
#define AVCODEC_VERSION_H
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_MAJOR 53
|
#define LIBAVCODEC_VERSION_MAJOR 53
|
||||||
#define LIBAVCODEC_VERSION_MINOR 7
|
#define LIBAVCODEC_VERSION_MINOR 8
|
||||||
#define LIBAVCODEC_VERSION_MICRO 0
|
#define LIBAVCODEC_VERSION_MICRO 0
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
@ -68,5 +68,8 @@
|
|||||||
#ifndef FF_API_GET_PIX_FMT_NAME
|
#ifndef FF_API_GET_PIX_FMT_NAME
|
||||||
#define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54)
|
#define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54)
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef FF_API_AVCODEC_OPEN
|
||||||
|
#define FF_API_AVCODEC_OPEN (LIBAVCODEC_VERSION_MAJOR < 54)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* AVCODEC_VERSION_H */
|
#endif /* AVCODEC_VERSION_H */
|
||||||
|
@ -1152,6 +1152,7 @@ AVFormatContext *avformat_alloc_output_context(const char *format,
|
|||||||
int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
|
int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
|
||||||
const char *format_name, const char *filename);
|
const char *format_name, const char *filename);
|
||||||
|
|
||||||
|
#if FF_API_FORMAT_PARAMETERS
|
||||||
/**
|
/**
|
||||||
* Read packets of a media file to get stream information. This
|
* Read packets of a media file to get stream information. This
|
||||||
* is useful for file formats with no headers such as MPEG. This
|
* is useful for file formats with no headers such as MPEG. This
|
||||||
@ -1164,8 +1165,34 @@ int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oforma
|
|||||||
* @return >=0 if OK, AVERROR_xxx on error
|
* @return >=0 if OK, AVERROR_xxx on error
|
||||||
* @todo Let the user decide somehow what information is needed so that
|
* @todo Let the user decide somehow what information is needed so that
|
||||||
* we do not waste time getting stuff the user does not need.
|
* we do not waste time getting stuff the user does not need.
|
||||||
|
*
|
||||||
|
* @deprecated use avformat_find_stream_info.
|
||||||
*/
|
*/
|
||||||
int av_find_stream_info(AVFormatContext *ic);
|
int av_find_stream_info(AVFormatContext *ic);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read packets of a media file to get stream information. This
|
||||||
|
* is useful for file formats with no headers such as MPEG. This
|
||||||
|
* function also computes the real framerate in case of MPEG-2 repeat
|
||||||
|
* frame mode.
|
||||||
|
* The logical file position is not changed by this function;
|
||||||
|
* examined packets may be buffered for later processing.
|
||||||
|
*
|
||||||
|
* @param ic media file handle
|
||||||
|
* @param options If non-NULL, an ic.nb_streams long array of pointers to
|
||||||
|
* dictionaries, where i-th member contains options for
|
||||||
|
* codec corresponding to i-th stream.
|
||||||
|
* On return each dictionary will be filled with options that were not found.
|
||||||
|
* @return >=0 if OK, AVERROR_xxx on error
|
||||||
|
*
|
||||||
|
* @note this function isn't guaranteed to open all the codecs, so
|
||||||
|
* options being non-empty at return is a perfectly normal behavior.
|
||||||
|
*
|
||||||
|
* @todo Let the user decide somehow what information is needed so that
|
||||||
|
* we do not waste time getting stuff the user does not need.
|
||||||
|
*/
|
||||||
|
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the "best" stream in the file.
|
* Find the "best" stream in the file.
|
||||||
|
@ -2121,7 +2121,7 @@ static int has_decode_delay_been_guessed(AVStream *st)
|
|||||||
st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
|
st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int try_decode_frame(AVStream *st, AVPacket *avpkt)
|
static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
|
||||||
{
|
{
|
||||||
int16_t *samples;
|
int16_t *samples;
|
||||||
AVCodec *codec;
|
AVCodec *codec;
|
||||||
@ -2132,7 +2132,7 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt)
|
|||||||
codec = avcodec_find_decoder(st->codec->codec_id);
|
codec = avcodec_find_decoder(st->codec->codec_id);
|
||||||
if (!codec)
|
if (!codec)
|
||||||
return -1;
|
return -1;
|
||||||
ret = avcodec_open(st->codec, codec);
|
ret = avcodec_open2(st->codec, codec, options);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2251,12 +2251,20 @@ static int tb_unreliable(AVCodecContext *c){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if FF_API_FORMAT_PARAMETERS
|
||||||
int av_find_stream_info(AVFormatContext *ic)
|
int av_find_stream_info(AVFormatContext *ic)
|
||||||
|
{
|
||||||
|
return avformat_find_stream_info(ic, NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||||
{
|
{
|
||||||
int i, count, ret, read_size, j;
|
int i, count, ret, read_size, j;
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
AVPacket pkt1, *pkt;
|
AVPacket pkt1, *pkt;
|
||||||
int64_t old_offset = avio_tell(ic->pb);
|
int64_t old_offset = avio_tell(ic->pb);
|
||||||
|
int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
|
||||||
|
|
||||||
for(i=0;i<ic->nb_streams;i++) {
|
for(i=0;i<ic->nb_streams;i++) {
|
||||||
AVCodec *codec;
|
AVCodec *codec;
|
||||||
@ -2293,12 +2301,12 @@ int av_find_stream_info(AVFormatContext *ic)
|
|||||||
/* Ensure that subtitle_header is properly set. */
|
/* Ensure that subtitle_header is properly set. */
|
||||||
if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
|
if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
|
||||||
&& codec && !st->codec->codec)
|
&& codec && !st->codec->codec)
|
||||||
avcodec_open(st->codec, codec);
|
avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
|
||||||
|
|
||||||
//try to just open decoders, in case this is enough to get parameters
|
//try to just open decoders, in case this is enough to get parameters
|
||||||
if(!has_codec_parameters(st->codec)){
|
if(!has_codec_parameters(st->codec)){
|
||||||
if (codec && !st->codec->codec)
|
if (codec && !st->codec->codec)
|
||||||
avcodec_open(st->codec, codec);
|
avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2408,7 +2416,7 @@ int av_find_stream_info(AVFormatContext *ic)
|
|||||||
for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
|
for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
|
||||||
int framerate= get_std_framerate(i);
|
int framerate= get_std_framerate(i);
|
||||||
int ticks= lrintf(dur*framerate/(1001*12));
|
int ticks= lrintf(dur*framerate/(1001*12));
|
||||||
double error= dur - ticks*1001*12/(double)framerate;
|
double error = dur - (double)ticks*1001*12 / framerate;
|
||||||
st->info->duration_error[i] += error*error;
|
st->info->duration_error[i] += error*error;
|
||||||
}
|
}
|
||||||
st->info->duration_count++;
|
st->info->duration_count++;
|
||||||
@ -2434,7 +2442,7 @@ int av_find_stream_info(AVFormatContext *ic)
|
|||||||
it takes longer and uses more memory. For MPEG-4, we need to
|
it takes longer and uses more memory. For MPEG-4, we need to
|
||||||
decompress for QuickTime. */
|
decompress for QuickTime. */
|
||||||
if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
|
if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
|
||||||
try_decode_frame(st, pkt);
|
try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
|
||||||
|
|
||||||
st->codec_info_nb_frames++;
|
st->codec_info_nb_frames++;
|
||||||
count++;
|
count++;
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "libavutil/avutil.h"
|
#include "libavutil/avutil.h"
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_MAJOR 53
|
#define LIBAVFORMAT_VERSION_MAJOR 53
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 4
|
#define LIBAVFORMAT_VERSION_MINOR 5
|
||||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
#define LIBAVFORMAT_VERSION_MICRO 0
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user