aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-10-26 02:09:31 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-10-26 02:36:07 +0200
commit51bfaa21c85201ab31776a447599349a1ed6e96b (patch)
treeb7baafad803a06c5d582606f37f91a27e8342e59
parentf5fdb12d5552a3710611f15cd72ce6c7b6fb4da0 (diff)
parenta3a8572165ce636fb011b78764a2584777f81b95 (diff)
downloadffmpeg-51bfaa21c85201ab31776a447599349a1ed6e96b.tar.gz
Merge remote-tracking branch 'qatar/master'
* qatar/master: (22 commits) g722dec: check output buffer size before decoding g722dec: cosmetics: reindent/linewrap g722dec: remove the use of lowres for half-rate decoding. tta: check for extradata allocation failure in tta demuxer tta: check for allocation failure of decode_buffer tta: use correct frame_length calculation. tta: add support for decoding 24-bit sample format cosmetics: indentation tta: remove pointless braces tta: check output buffer size after adjusting frame length for last frame tta: fix reading of format in TTA header. tta: remove useless commented-out lines tta: check remaining bitstream size while reading unary value lavf: deprecate AVStream.stream_copy avconc: split choose_codec() to choose_decoder/choose_encoder. lavf: simplify by using FFMAX/FFMIN. mpegenc: add preload private option. cosmetics: simplify latm_decode_init latm: avoid unnecessary reinit of the aac decoder aacdec: initialize sbr context only in new channel elements ... Conflicts: avconv.c libavcodec/resample.c libavcodec/tta.c libavformat/utils.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--avconv.c87
-rw-r--r--ffmpeg.c99
-rw-r--r--libavcodec/aacdec.c22
-rw-r--r--libavcodec/g722dec.c56
-rw-r--r--libavcodec/resample.c1
-rw-r--r--libavcodec/tta.c278
-rw-r--r--libavformat/avformat.h8
-rw-r--r--libavformat/mpegenc.c10
-rw-r--r--libavformat/tta.c4
-rw-r--r--libavformat/utils.c18
-rw-r--r--libavformat/version.h6
11 files changed, 301 insertions, 288 deletions
diff --git a/avconv.c b/avconv.c
index e8fd7eae65..1409131971 100644
--- a/avconv.c
+++ b/avconv.c
@@ -243,6 +243,7 @@ typedef struct OutputStream {
int64_t sws_flags;
AVDictionary *opts;
int is_past_recording_time;
+ int stream_copy;
} OutputStream;
#if HAVE_TERMIOS_H
@@ -396,7 +397,6 @@ static void reset_options(OptionsContext *o)
memset(o, 0, sizeof(*o));
- o->mux_preload = 0.5;
o->mux_max_delay = 0.7;
o->recording_time = INT64_MAX;
o->limit_filesize = UINT64_MAX;
@@ -1407,7 +1407,7 @@ static void print_report(OutputFile *output_files,
float q = -1;
ost = &ost_table[i];
enc = ost->st->codec;
- if (!ost->st->stream_copy && enc->coded_frame)
+ if (!ost->stream_copy && enc->coded_frame)
q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
@@ -2054,7 +2054,7 @@ static int transcode_init(OutputFile *output_files,
codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
codec->chroma_sample_location = icodec->chroma_sample_location;
- if (ost->st->stream_copy) {
+ if (ost->stream_copy) {
uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
if (extra_size > INT_MAX) {
@@ -2150,9 +2150,8 @@ static int transcode_init(OutputFile *output_files,
return AVERROR(ENOMEM);
}
ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
- if (!codec->sample_rate) {
+ if (!codec->sample_rate)
codec->sample_rate = icodec->sample_rate;
- }
choose_sample_rate(ost->st, ost->enc);
codec->time_base = (AVRational){1, codec->sample_rate};
if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
@@ -2360,7 +2359,7 @@ static int transcode_init(OutputFile *output_files,
av_log(NULL, AV_LOG_INFO, " [sync #%d.%d]",
ost->sync_ist->file_index,
ost->sync_ist->st->index);
- if (ost->st->stream_copy)
+ if (ost->stream_copy)
av_log(NULL, AV_LOG_INFO, " (copy)");
else
av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
@@ -2643,7 +2642,7 @@ static int transcode(OutputFile *output_files,
for (i = 0; i < nb_output_streams; i++) {
ost = &output_streams[i];
if (ost) {
- if (ost->st->stream_copy)
+ if (ost->stream_copy)
av_freep(&ost->st->codec->extradata);
if (ost->logfile) {
fclose(ost->logfile);
@@ -2842,13 +2841,11 @@ static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
return 0;
}
-static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
+static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
{
const char *codec_string = encoder ? "encoder" : "decoder";
AVCodec *codec;
- if(!name)
- return CODEC_ID_NONE;
codec = encoder ?
avcodec_find_encoder_by_name(name) :
avcodec_find_decoder_by_name(name);
@@ -2860,29 +2857,20 @@ static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, i
av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
exit_program(1);
}
- return codec->id;
+ return codec;
}
-static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
+static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
{
char *codec_name = NULL;
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
-
- if (!codec_name) {
- if (s->oformat) {
- st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
- return avcodec_find_encoder(st->codec->codec_id);
- }
- } else if (!strcmp(codec_name, "copy"))
- st->stream_copy = 1;
- else {
- st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
- return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
- avcodec_find_decoder_by_name(codec_name);
- }
-
- return NULL;
+ if (codec_name) {
+ AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
+ st->codec->codec_id = codec->id;
+ return codec;
+ } else
+ return avcodec_find_decoder(st->codec->codec_id);
}
/**
@@ -2909,9 +2897,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
ist->ts_scale = scale;
- ist->dec = choose_codec(o, ic, st, dec->codec_type);
- if (!ist->dec)
- ist->dec = avcodec_find_decoder(dec->codec_id);
+ ist->dec = choose_decoder(o, ic, st);
switch (dec->codec_type) {
case AVMEDIA_TYPE_AUDIO:
@@ -3016,7 +3002,7 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena
/* apply forced codec ids */
for (i = 0; i < ic->nb_streams; i++)
- choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
+ choose_decoder(o, ic, ic->streams[i]);
/* Set AVCodecContext options for avformat_find_stream_info */
opts = setup_find_stream_info_opts(ic, codec_opts);
@@ -3134,6 +3120,23 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV
return ret;
}
+static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
+{
+ char *codec_name = NULL;
+
+ MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
+ if (!codec_name) {
+ ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
+ NULL, ost->st->codec->codec_type);
+ ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
+ } else if (!strcmp(codec_name, "copy"))
+ ost->stream_copy = 1;
+ else {
+ ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
+ ost->st->codec->codec_id = ost->enc->id;
+ }
+}
+
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
{
OutputStream *ost;
@@ -3161,7 +3164,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->index = idx;
ost->st = st;
st->codec->codec_type = type;
- ost->enc = choose_codec(o, oc, st, type);
+ choose_encoder(o, oc, ost);
if (ost->enc) {
ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
}
@@ -3262,7 +3265,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
st = ost->st;
video_enc = st->codec;
- if (!st->stream_copy) {
+ if (!ost->stream_copy) {
const char *p = NULL;
char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
@@ -3379,7 +3382,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
audio_enc = st->codec;
audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
- if (!st->stream_copy) {
+ if (!ost->stream_copy) {
char *sample_fmt = NULL;
MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
@@ -3399,12 +3402,10 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
{
- AVStream *st;
OutputStream *ost;
ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
- st = ost->st;
- if (!st->stream_copy) {
+ if (!ost->stream_copy) {
av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
exit_program(1);
}
@@ -3415,7 +3416,7 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
{
OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
- ost->st->stream_copy = 1;
+ ost->stream_copy = 1;
return ost;
}
@@ -3520,9 +3521,9 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
avcodec_copy_context(st->codec, ic->streams[i]->codec);
- if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
+ if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
choose_sample_fmt(st, codec);
- else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
+ else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
choose_pixel_fmt(st, codec);
}
@@ -3678,7 +3679,11 @@ static void opt_output_file(void *optctx, const char *filename)
}
}
- oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
+ if (o->mux_preload) {
+ uint8_t buf[64];
+ snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
+ av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
+ }
oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
/* copy chapters */
diff --git a/ffmpeg.c b/ffmpeg.c
index df5b2fa114..1a3cc3c79b 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -251,6 +251,7 @@ typedef struct OutputStream {
int64_t sws_flags;
AVDictionary *opts;
int is_past_recording_time;
+ int stream_copy;
} OutputStream;
@@ -410,7 +411,6 @@ static void reset_options(OptionsContext *o, int is_input)
if(is_input) o->recording_time = bak.recording_time;
else o->recording_time = INT64_MAX;
- o->mux_preload = 0.5;
o->mux_max_delay = 0.7;
o->limit_filesize = UINT64_MAX;
o->chapters_input_file = INT_MAX;
@@ -1414,7 +1414,7 @@ static void print_report(OutputFile *output_files,
float q = -1;
ost = &ost_table[i];
enc = ost->st->codec;
- if (!ost->st->stream_copy && enc->coded_frame)
+ if (!ost->stream_copy && enc->coded_frame)
q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
@@ -2066,7 +2066,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files,
codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
codec->chroma_sample_location = icodec->chroma_sample_location;
- if (ost->st->stream_copy) {
+ if (ost->stream_copy) {
uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
if (extra_size > INT_MAX) {
@@ -2161,9 +2161,8 @@ static int transcode_init(OutputFile *output_files, int nb_output_files,
if (!ost->fifo) {
return AVERROR(ENOMEM);
}
- if (!codec->sample_rate) {
+ if (!codec->sample_rate)
codec->sample_rate = icodec->sample_rate;
- }
choose_sample_rate(ost->st, ost->enc);
codec->time_base = (AVRational){1, codec->sample_rate};
if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
@@ -2377,7 +2376,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files,
av_log(NULL, AV_LOG_INFO, " [sync #%d.%d]",
ost->sync_ist->file_index,
ost->sync_ist->st->index);
- if (ost->st->stream_copy)
+ if (ost->stream_copy)
av_log(NULL, AV_LOG_INFO, " (copy)");
else
av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
@@ -2701,7 +2700,7 @@ static int transcode(OutputFile *output_files, int nb_output_files,
for (i = 0; i < nb_output_streams; i++) {
ost = &output_streams[i];
if (ost) {
- if (ost->st->stream_copy)
+ if (ost->stream_copy)
av_freep(&ost->st->codec->extradata);
if (ost->logfile) {
fclose(ost->logfile);
@@ -2944,13 +2943,11 @@ static int opt_recording_timestamp(OptionsContext *o, const char *opt, const cha
return 0;
}
-static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
+static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
{
const char *codec_string = encoder ? "encoder" : "decoder";
AVCodec *codec;
- if(!name)
- return CODEC_ID_NONE;
codec = encoder ?
avcodec_find_encoder_by_name(name) :
avcodec_find_decoder_by_name(name);
@@ -2962,29 +2959,20 @@ static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, i
av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
exit_program(1);
}
- return codec->id;
+ return codec;
}
-static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
+static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
{
char *codec_name = NULL;
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
-
- if (!codec_name) {
- if (s->oformat) {
- st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
- return avcodec_find_encoder(st->codec->codec_id);
- }
- } else if (!strcmp(codec_name, "copy"))
- st->stream_copy = 1;
- else {
- st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
- return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
- avcodec_find_decoder_by_name(codec_name);
- }
-
- return NULL;
+ if (codec_name) {
+ AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
+ st->codec->codec_id = codec->id;
+ return codec;
+ } else
+ return avcodec_find_decoder(st->codec->codec_id);
}
/**
@@ -3020,9 +3008,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
st->codec->codec_tag = tag;
}
- ist->dec = choose_codec(o, ic, st, dec->codec_type);
- if (!ist->dec)
- ist->dec = avcodec_find_decoder(dec->codec_id);
+ ist->dec = choose_decoder(o, ic, st);
switch (dec->codec_type) {
case AVMEDIA_TYPE_AUDIO:
@@ -3115,12 +3101,12 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena
if (o->nb_frame_pix_fmts)
av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
- ic->video_codec_id =
- find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
- ic->audio_codec_id =
- find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
- ic->subtitle_codec_id=
- find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
+ ic->video_codec_id = video_codec_name ?
+ find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
+ ic->audio_codec_id = audio_codec_name ?
+ find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
+ ic->subtitle_codec_id= subtitle_codec_name ?
+ find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
ic->flags |= AVFMT_FLAG_NONBLOCK;
if (loop_input) {
@@ -3138,7 +3124,7 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena
/* apply forced codec ids */
for (i = 0; i < ic->nb_streams; i++)
- choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
+ choose_decoder(o, ic, ic->streams[i]);
/* Set AVCodecContext options for avformat_find_stream_info */
opts = setup_find_stream_info_opts(ic, codec_opts);
@@ -3253,6 +3239,23 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV
return ret;
}
+static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
+{
+ char *codec_name = NULL;
+
+ MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
+ if (!codec_name) {
+ ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
+ NULL, ost->st->codec->codec_type);
+ ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
+ } else if (!strcmp(codec_name, "copy"))
+ ost->stream_copy = 1;
+ else {
+ ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
+ ost->st->codec->codec_id = ost->enc->id;
+ }
+}
+
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
{
OutputStream *ost;
@@ -3280,7 +3283,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->index = idx;
ost->st = st;
st->codec->codec_type = type;
- ost->enc = choose_codec(o, oc, st, type);
+ choose_encoder(o, oc, ost);
if (ost->enc) {
ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
}
@@ -3381,7 +3384,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
st = ost->st;
video_enc = st->codec;
- if (!st->stream_copy) {
+ if (!ost->stream_copy) {
const char *p = NULL;
char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
@@ -3502,7 +3505,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
audio_enc = st->codec;
audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
- if (!st->stream_copy) {
+ if (!ost->stream_copy) {
char *sample_fmt = NULL;
MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
@@ -3525,12 +3528,10 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
{
- AVStream *st;
OutputStream *ost;
ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
- st = ost->st;
- if (!st->stream_copy) {
+ if (!ost->stream_copy) {
av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
exit_program(1);
}
@@ -3541,7 +3542,7 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
{
OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
- ost->st->stream_copy = 1;
+ ost->stream_copy = 1;
return ost;
}
@@ -3646,9 +3647,9 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
avcodec_copy_context(st->codec, ic->streams[i]->codec);
- if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
+ if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
choose_sample_fmt(st, codec);
- else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
+ else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
choose_pixel_fmt(st, codec);
}
@@ -3812,7 +3813,11 @@ static void opt_output_file(void *optctx, const char *filename)
}
}
- oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
+ if (o->mux_preload) {
+ uint8_t buf[64];
+ snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
+ av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
+ }
oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
if (loop_output >= 0) {
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index 97d187c2a2..7c8d74e857 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -184,9 +184,11 @@ static av_cold int che_configure(AACContext *ac,
int type, int id, int *channels)
{
if (che_pos[type][id]) {
- if (!ac->che[type][id] && !(ac->che[type][id] = av_mallocz(sizeof(ChannelElement))))
- return AVERROR(ENOMEM);
- ff_aac_sbr_ctx_init(ac, &ac->che[type][id]->sbr);
+ if (!ac->che[type][id]) {
+ if (!(ac->che[type][id] = av_mallocz(sizeof(ChannelElement))))
+ return AVERROR(ENOMEM);
+ ff_aac_sbr_ctx_init(ac, &ac->che[type][id]->sbr);
+ }
if (type != TYPE_CCE) {
ac->output_data[(*channels)++] = ac->che[type][id]->ch[0].ret;
if (type == TYPE_CPE ||
@@ -2521,8 +2523,9 @@ static int latm_decode_frame(AVCodecContext *avctx, void *out, int *out_size,
*out_size = 0;
return avpkt->size;
} else {
- aac_decode_close(avctx);
- if ((err = aac_decode_init(avctx)) < 0)
+ if ((err = decode_audio_specific_config(
+ &latmctx->aac_ctx, avctx, &latmctx->aac_ctx.m4ac,
+ avctx->extradata, avctx->extradata_size, 8*avctx->extradata_size)) < 0)
return err;
latmctx->initialized = 1;
}
@@ -2544,15 +2547,10 @@ static int latm_decode_frame(AVCodecContext *avctx, void *out, int *out_size,
av_cold static int latm_decode_init(AVCodecContext *avctx)
{
struct LATMContext *latmctx = avctx->priv_data;
- int ret;
-
- ret = aac_decode_init(avctx);
+ int ret = aac_decode_init(avctx);
- if (avctx->extradata_size > 0) {
+ if (avctx->extradata_size > 0)
latmctx->initialized = !ret;
- } else {
- latmctx->initialized = 0;
- }
return ret;
}
diff --git a/libavcodec/g722dec.c b/libavcodec/g722dec.c
index 51f87c9d3c..2be47159a4 100644
--- a/libavcodec/g722dec.c
+++ b/libavcodec/g722dec.c
@@ -66,9 +66,6 @@ static av_cold int g722_decode_init(AVCodecContext * avctx)
c->band[1].scale_factor = 2;
c->prev_samples_pos = 22;
- if (avctx->lowres)
- avctx->sample_rate /= 2;
-
return 0;
}
@@ -88,15 +85,22 @@ static int g722_decode_frame(AVCodecContext *avctx, void *data,
{
G722Context *c = avctx->priv_data;
int16_t *out_buf = data;
- int j, out_len = 0;
+ int j, out_len;
const int skip = 8 - avctx->bits_per_coded_sample;
const int16_t *quantizer_table = low_inv_quants[skip];
GetBitContext gb;
+ out_len = avpkt->size * 2 * av_get_bytes_per_sample(avctx->sample_fmt);
+ if (*data_size < out_len) {
+ av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
+ return AVERROR(EINVAL);
+ }
+
init_get_bits(&gb, avpkt->data, avpkt->size * 8);
for (j = 0; j < avpkt->size; j++) {
- int ilow, ihigh, rlow;
+ int ilow, ihigh, rlow, rhigh, dhigh;
+ int xout1, xout2;
ihigh = get_bits(&gb, 2);
ilow = get_bits(&gb, 6 - skip);
@@ -107,31 +111,24 @@ static int g722_decode_frame(AVCodecContext *avctx, void *data,
ff_g722_update_low_predictor(&c->band[0], ilow >> (2 - skip));
- if (!avctx->lowres) {
- const int dhigh = c->band[1].scale_factor *
- ff_g722_high_inv_quant[ihigh] >> 10;
- const int rhigh = av_clip(dhigh + c->band[1].s_predictor,
- -16384, 16383);
- int xout1, xout2;
-
- ff_g722_update_high_predictor(&c->band[1], dhigh, ihigh);
-
- c->prev_samples[c->prev_samples_pos++] = rlow + rhigh;
- c->prev_samples[c->prev_samples_pos++] = rlow - rhigh;
- ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24,
- &xout1, &xout2);
- out_buf[out_len++] = av_clip_int16(xout1 >> 12);
- out_buf[out_len++] = av_clip_int16(xout2 >> 12);
- if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) {
- memmove(c->prev_samples,
- c->prev_samples + c->prev_samples_pos - 22,
- 22 * sizeof(c->prev_samples[0]));
- c->prev_samples_pos = 22;
- }
- } else
- out_buf[out_len++] = rlow;
+ dhigh = c->band[1].scale_factor * ff_g722_high_inv_quant[ihigh] >> 10;
+ rhigh = av_clip(dhigh + c->band[1].s_predictor, -16384, 16383);
+
+ ff_g722_update_high_predictor(&c->band[1], dhigh, ihigh);
+
+ c->prev_samples[c->prev_samples_pos++] = rlow + rhigh;
+ c->prev_samples[c->prev_samples_pos++] = rlow - rhigh;
+ ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24,
+ &xout1, &xout2);
+ *out_buf++ = av_clip_int16(xout1 >> 12);
+ *out_buf++ = av_clip_int16(xout2 >> 12);
+ if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) {
+ memmove(c->prev_samples, c->prev_samples + c->prev_samples_pos - 22,
+ 22 * sizeof(c->prev_samples[0]));
+ c->prev_samples_pos = 22;
+ }
}
- *data_size = out_len << 1;
+ *data_size = out_len;
return avpkt->size;
}
@@ -143,5 +140,4 @@ AVCodec ff_adpcm_g722_decoder = {
.init = g722_decode_init,
.decode = g722_decode_frame,
.long_name = NULL_IF_CONFIG_SMALL("G.722 ADPCM"),
- .max_lowres = 1,
};
diff --git a/libavcodec/resample.c b/libavcodec/resample.c
index a1018b44fc..b5be910672 100644
--- a/libavcodec/resample.c
+++ b/libavcodec/resample.c
@@ -265,7 +265,6 @@ ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
}
}
-#define TAPS 16
s->resample_context = av_resample_init(output_rate, input_rate,
filter_length, log2_phase_count,
linear, cutoff);
diff --git a/libavcodec/tta.c b/libavcodec/tta.c
index 0bd8c600bf..7ff5116ffb 100644
--- a/libavcodec/tta.c
+++ b/libavcodec/tta.c
@@ -33,8 +33,8 @@
#include "avcodec.h"
#include "get_bits.h"
-#define FORMAT_INT 1
-#define FORMAT_FLOAT 3
+#define FORMAT_SIMPLE 1
+#define FORMAT_ENCRYPTED 2
#define MAX_ORDER 16
typedef struct TTAFilter {
@@ -58,7 +58,7 @@ typedef struct TTAContext {
AVCodecContext *avctx;
GetBitContext gb;
- int flags, channels, bps, is_float, data_length;
+ int format, channels, bps, data_length;
int frame_length, last_frame_length, total_frames;
int32_t *decode_buffer;
@@ -182,7 +182,7 @@ static int tta_get_unary(GetBitContext *gb)
int ret = 0;
// count ones
- while(get_bits1(gb))
+ while (get_bits_left(gb) > 0 && get_bits1(gb))
ret++;
return ret;
}
@@ -213,58 +213,54 @@ static av_cold int tta_decode_init(AVCodecContext * avctx)
{
/* signature */
skip_bits(&s->gb, 32);
-// if (get_bits_long(&s->gb, 32) != av_bswap32(AV_RL32("TTA1"))) {
-// av_log(s->avctx, AV_LOG_ERROR, "Missing magic\n");
-// return -1;
-// }
-
- s->flags = get_bits(&s->gb, 16);
- if (s->flags != 1 && s->flags != 3)
- {
- av_log(s->avctx, AV_LOG_ERROR, "Invalid flags\n");
+
+ s->format = get_bits(&s->gb, 16);
+ if (s->format > 2) {
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid format\n");
return -1;
}
- s->is_float = (s->flags == FORMAT_FLOAT);
+ if (s->format == FORMAT_ENCRYPTED) {
+ av_log_missing_feature(s->avctx, "Encrypted TTA", 0);
+ return AVERROR(EINVAL);
+ }
avctx->channels = s->channels = get_bits(&s->gb, 16);
if (s->channels > 1 && s->channels < 9)
avctx->channel_layout = tta_channel_layouts[s->channels-2];
avctx->bits_per_coded_sample = get_bits(&s->gb, 16);
s->bps = (avctx->bits_per_coded_sample + 7) / 8;
avctx->sample_rate = get_bits_long(&s->gb, 32);
- if(avctx->sample_rate > 1000000){ //prevent FRAME_TIME * avctx->sample_rate from overflowing and sanity check
- av_log(avctx, AV_LOG_ERROR, "sample_rate too large\n");
- return -1;
- }
s->data_length = get_bits_long(&s->gb, 32);
skip_bits(&s->gb, 32); // CRC32 of header
- if (s->is_float)
- {
- avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
- av_log_ask_for_sample(s->avctx, "Unsupported sample format.\n");
- return -1;
- }
- else switch(s->bps) {
- case 1: avctx->sample_fmt = AV_SAMPLE_FMT_U8; break;
- case 2: avctx->sample_fmt = AV_SAMPLE_FMT_S16; break;
- case 3: avctx->bits_per_coded_sample = 24;
- case 4: avctx->sample_fmt = AV_SAMPLE_FMT_S32; break;
- default:
- av_log_ask_for_sample(s->avctx,
- "Invalid/unsupported sample format.\n");
- return -1;
+ switch(s->bps) {
+ case 1: avctx->sample_fmt = AV_SAMPLE_FMT_U8; break;
+ case 2:
+ avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+ avctx->bits_per_raw_sample = 16;
+ break;
+ case 3:
+ avctx->sample_fmt = AV_SAMPLE_FMT_S32;
+ avctx->bits_per_raw_sample = 24;
+ break;
+ //case 4: avctx->sample_fmt = AV_SAMPLE_FMT_S32; break;
+ default:
+ av_log(avctx, AV_LOG_ERROR, "Invalid/unsupported sample format.\n");
+ return AVERROR_INVALIDDATA;
}
- // FIXME: horribly broken, but directly from reference source
-#define FRAME_TIME 1.04489795918367346939
- s->frame_length = (int)(FRAME_TIME * avctx->sample_rate);
+ // prevent overflow
+ if (avctx->sample_rate > 0x7FFFFF) {
+ av_log(avctx, AV_LOG_ERROR, "sample_rate too large\n");
+ return AVERROR(EINVAL);
+ }
+ s->frame_length = 256 * avctx->sample_rate / 245;
s->last_frame_length = s->data_length % s->frame_length;
s->total_frames = s->data_length / s->frame_length +
(s->last_frame_length ? 1 : 0);
- av_log(s->avctx, AV_LOG_DEBUG, "flags: %x chans: %d bps: %d rate: %d block: %d\n",
- s->flags, avctx->channels, avctx->bits_per_coded_sample, avctx->sample_rate,
+ av_log(s->avctx, AV_LOG_DEBUG, "format: %d chans: %d bps: %d rate: %d block: %d\n",
+ s->format, avctx->channels, avctx->bits_per_coded_sample, avctx->sample_rate,
avctx->block_align);
av_log(s->avctx, AV_LOG_DEBUG, "data_length: %d frame_length: %d last: %d total: %d\n",
s->data_length, s->frame_length, s->last_frame_length, s->total_frames);
@@ -283,8 +279,10 @@ static av_cold int tta_decode_init(AVCodecContext * avctx)
if (!s->decode_buffer)
return AVERROR(ENOMEM);
s->ch_ctx = av_malloc(avctx->channels * sizeof(*s->ch_ctx));
- if (!s->ch_ctx)
+ if (!s->ch_ctx) {
+ av_freep(&s->decode_buffer);
return AVERROR(ENOMEM);
+ }
} else {
av_log(avctx, AV_LOG_ERROR, "Wrong extradata present\n");
return -1;
@@ -300,114 +298,113 @@ static int tta_decode_frame(AVCodecContext *avctx,
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
TTAContext *s = avctx->priv_data;
- int i;
+ int i, out_size;
+ int cur_chan = 0, framelen = s->frame_length;
+ int32_t *p;
init_get_bits(&s->gb, buf, buf_size*8);
- {
- int cur_chan = 0, framelen = s->frame_length;
- int32_t *p;
- if (*data_size < (framelen * s->channels * av_get_bits_per_sample_fmt(avctx->sample_fmt) / 8)) {
- av_log(avctx, AV_LOG_ERROR, "Output buffer size is too small.\n");
- return -1;
- }
- // FIXME: seeking
- s->total_frames--;
- if (!s->total_frames && s->last_frame_length)
- framelen = s->last_frame_length;
-
- // init per channel states
- for (i = 0; i < s->channels; i++) {
- s->ch_ctx[i].predictor = 0;
- ttafilter_init(&s->ch_ctx[i].filter, ttafilter_configs[s->bps-1][0], ttafilter_configs[s->bps-1][1]);
- rice_init(&s->ch_ctx[i].rice, 10, 10);
+ // FIXME: seeking
+ s->total_frames--;
+ if (!s->total_frames && s->last_frame_length)
+ framelen = s->last_frame_length;
+
+ out_size = framelen * s->channels * av_get_bytes_per_sample(avctx->sample_fmt);
+ if (*data_size < out_size) {
+ av_log(avctx, AV_LOG_ERROR, "Output buffer size is too small.\n");
+ return -1;
+ }
+
+ // decode directly to output buffer for 24-bit sample format
+ if (s->bps == 3)
+ s->decode_buffer = data;
+
+ // init per channel states
+ for (i = 0; i < s->channels; i++) {
+ s->ch_ctx[i].predictor = 0;
+ ttafilter_init(&s->ch_ctx[i].filter, ttafilter_configs[s->bps-1][0], ttafilter_configs[s->bps-1][1]);
+ rice_init(&s->ch_ctx[i].rice, 10, 10);
+ }
+
+ for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) {
+ int32_t *predictor = &s->ch_ctx[cur_chan].predictor;
+ TTAFilter *filter = &s->ch_ctx[cur_chan].filter;
+ TTARice *rice = &s->ch_ctx[cur_chan].rice;
+ uint32_t unary, depth, k;
+ int32_t value;
+
+ unary = tta_get_unary(&s->gb);
+
+ if (unary == 0) {
+ depth = 0;
+ k = rice->k0;
+ } else {
+ depth = 1;
+ k = rice->k1;
+ unary--;
}
- for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) {
- int32_t *predictor = &s->ch_ctx[cur_chan].predictor;
- TTAFilter *filter = &s->ch_ctx[cur_chan].filter;
- TTARice *rice = &s->ch_ctx[cur_chan].rice;
- uint32_t unary, depth, k;
- int32_t value;
-
- unary = tta_get_unary(&s->gb);
-
- if (unary == 0) {
- depth = 0;
- k = rice->k0;
- } else {
- depth = 1;
- k = rice->k1;
- unary--;
- }
+ if (get_bits_left(&s->gb) < k)
+ return -1;
- if (get_bits_left(&s->gb) < k)
+ if (k) {
+ if (k > MIN_CACHE_BITS)
return -1;
+ value = (unary << k) + get_bits(&s->gb, k);
+ } else
+ value = unary;
+
+ // FIXME: copy paste from original
+ switch (depth) {
+ case 1:
+ rice->sum1 += value - (rice->sum1 >> 4);
+ if (rice->k1 > 0 && rice->sum1 < shift_16[rice->k1])
+ rice->k1--;
+ else if(rice->sum1 > shift_16[rice->k1 + 1])
+ rice->k1++;
+ value += shift_1[rice->k0];
+ default:
+ rice->sum0 += value - (rice->sum0 >> 4);
+ if (rice->k0 > 0 && rice->sum0 < shift_16[rice->k0])
+ rice->k0--;
+ else if(rice->sum0 > shift_16[rice->k0 + 1])
+ rice->k0++;
+ }
- if (k) {
- if (k > MIN_CACHE_BITS)
- return -1;
- value = (unary << k) + get_bits(&s->gb, k);
- } else
- value = unary;
-
- // FIXME: copy paste from original
- switch (depth) {
- case 1:
- rice->sum1 += value - (rice->sum1 >> 4);
- if (rice->k1 > 0 && rice->sum1 < shift_16[rice->k1])
- rice->k1--;
- else if(rice->sum1 > shift_16[rice->k1 + 1])
- rice->k1++;
- value += shift_1[rice->k0];
- default:
- rice->sum0 += value - (rice->sum0 >> 4);
- if (rice->k0 > 0 && rice->sum0 < shift_16[rice->k0])
- rice->k0--;
- else if(rice->sum0 > shift_16[rice->k0 + 1])
- rice->k0++;
- }
-
- // extract coded value
+ // extract coded value
#define UNFOLD(x) (((x)&1) ? (++(x)>>1) : (-(x)>>1))
- *p = UNFOLD(value);
+ *p = UNFOLD(value);
- // run hybrid filter
- ttafilter_process(filter, p, 0);
+ // run hybrid filter
+ ttafilter_process(filter, p, 0);
- // fixed order prediction
+ // fixed order prediction
#define PRED(x, k) (int32_t)((((uint64_t)x << k) - x) >> k)
- switch (s->bps) {
- case 1: *p += PRED(*predictor, 4); break;
- case 2:
- case 3: *p += PRED(*predictor, 5); break;
- case 4: *p += *predictor; break;
- }
- *predictor = *p;
-
- /*if ((get_bits_count(&s->gb)+7)/8 > buf_size)
- {
- av_log(NULL, AV_LOG_INFO, "overread!!\n");
- break;
- }*/
-
- // flip channels
- if (cur_chan < (s->channels-1))
- cur_chan++;
- else {
- // decorrelate in case of stereo integer
- if (!s->is_float && (s->channels > 1)) {
- int32_t *r = p - 1;
- for (*p += *r / 2; r > p - s->channels; r--)
- *r = *(r + 1) - *r;
- }
- cur_chan = 0;
+ switch (s->bps) {
+ case 1: *p += PRED(*predictor, 4); break;
+ case 2:
+ case 3: *p += PRED(*predictor, 5); break;
+ case 4: *p += *predictor; break;
+ }
+ *predictor = *p;
+
+ // flip channels
+ if (cur_chan < (s->channels-1))
+ cur_chan++;
+ else {
+ // decorrelate in case of stereo integer
+ if (s->channels > 1) {
+ int32_t *r = p - 1;
+ for (*p += *r / 2; r > p - s->channels; r--)
+ *r = *(r + 1) - *r;
}
+ cur_chan = 0;
}
+ }
- if (get_bits_left(&s->gb) < 32)
- return -1;
- skip_bits(&s->gb, 32); // frame crc
+ if (get_bits_left(&s->gb) < 32)
+ return -1;
+ skip_bits(&s->gb, 32); // frame crc
// convert to output buffer
switch(s->bps) {
@@ -415,32 +412,29 @@ static int tta_decode_frame(AVCodecContext *avctx,
uint8_t *samples = data;
for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
*samples++ = *p + 0x80;
- *data_size = samples - (uint8_t *)data;
break;
}
case 2: {
uint16_t *samples = data;
- for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) {
-// *samples++ = (unsigned char)*p;
-// *samples++ = (unsigned char)(*p >> 8);
+ for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
*samples++ = *p;
- }
- *data_size = (uint8_t *)samples - (uint8_t *)data;
break;
}
case 3: {
+ // shift samples for 24-bit sample format
int32_t *samples = data;
for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
- *samples++ = AV_RN32(p) << 8;
- *data_size = (uint8_t *)samples - (uint8_t *)data;
+ *samples++ <<= 8;
+ // reset decode buffer
+ s->decode_buffer = NULL;
break;
}
default:
av_log(s->avctx, AV_LOG_ERROR, "Error, only 16bit samples supported!\n");
}
- }
-// return get_bits_count(&s->gb)+7)/8;
+ *data_size = out_size;
+
return buf_size;
}
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 441f85d503..425198fcda 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -540,8 +540,10 @@ typedef struct AVStream {
*/
AVRational time_base;
int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
+#if FF_API_STREAM_COPY
/* ffmpeg.c private use */
- int stream_copy; /**< If set, just copy stream. */
+ attribute_deprecated int stream_copy; /**< If set, just copy stream. */
+#endif
enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.
#if FF_API_AVSTREAM_QUALITY
@@ -772,7 +774,9 @@ typedef struct AVFormatContext {
attribute_deprecated int mux_rate;
#endif
unsigned int packet_size;
- int preload;
+#if FF_API_PRELOAD
+ attribute_deprecated int preload;
+#endif
int max_delay;
#if FF_API_LOOP_OUTPUT
diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c
index 817f541805..9e19a3d5e4 100644
--- a/libavformat/mpegenc.c
+++ b/libavformat/mpegenc.c
@@ -77,6 +77,7 @@ typedef struct {
double vcd_padding_bitrate; //FIXME floats
int64_t vcd_padding_bytes_written;
+ int preload;
} MpegMuxContext;
extern AVOutputFormat ff_mpeg1vcd_muxer;
@@ -1158,9 +1159,15 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
StreamInfo *stream = st->priv_data;
int64_t pts, dts;
PacketDesc *pkt_desc;
- const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
+ int preload;
const int is_iframe = st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (pkt->flags & AV_PKT_FLAG_KEY);
+#if FF_API_PRELOAD
+ if (ctx->preload)
+ s->preload = ctx->preload;
+#endif
+ preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
+
pts= pkt->pts;
dts= pkt->dts;
@@ -1237,6 +1244,7 @@ static int mpeg_mux_end(AVFormatContext *ctx)
#define E AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
{ "muxrate", NULL, OFFSET(mux_rate), AV_OPT_TYPE_INT, {0}, 0, INT_MAX, E },
+ { "preload", "Initial demux-decode delay in microseconds.", OFFSET(preload), AV_OPT_TYPE_INT, {500000}, 0, INT_MAX, E},
{ NULL },
};
diff --git a/libavformat/tta.c b/libavformat/tta.c
index ca2d36b44f..4d0c6adeee 100644
--- a/libavformat/tta.c
+++ b/libavformat/tta.c
@@ -107,6 +107,10 @@ static int tta_read_header(AVFormatContext *s, AVFormatParameters *ap)
return -1;
}
st->codec->extradata = av_mallocz(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codec->extradata) {
+ st->codec->extradata_size = 0;
+ return AVERROR(ENOMEM);
+ }
avio_seek(s->pb, start_offset, SEEK_SET);
avio_read(s->pb, st->codec->extradata, st->codec->extradata_size);
diff --git a/libavformat/utils.c b/libavformat/utils.c
index db27024904..1c6a4684a1 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1932,29 +1932,24 @@ static void update_stream_timings(AVFormatContext *ic)
if (start_time1 < start_time_text)
start_time_text = start_time1;
} else
- if (start_time1 < start_time)
- start_time = start_time1;
+ start_time = FFMIN(start_time, start_time1);
if (st->duration != AV_NOPTS_VALUE) {
end_time1 = start_time1
+ av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
- if (end_time1 > end_time)
- end_time = end_time1;
+ end_time = FFMAX(end_time, end_time1);
}
}
if (st->duration != AV_NOPTS_VALUE) {
duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
- if (duration1 > duration)
- duration = duration1;
+ duration = FFMAX(duration, duration1);
}
}
if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
start_time = start_time_text;
if (start_time != INT64_MAX) {
ic->start_time = start_time;
- if (end_time != INT64_MIN) {
- if (end_time - start_time > duration)
- duration = end_time - start_time;
- }
+ if (end_time != INT64_MIN)
+ duration = FFMAX(duration, end_time - start_time);
}
if (duration != INT64_MIN && ic->duration == AV_NOPTS_VALUE) {
ic->duration = duration;
@@ -2108,8 +2103,7 @@ static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
file_size = 0;
} else {
file_size = avio_size(ic->pb);
- if (file_size < 0)
- file_size = 0;
+ file_size = FFMAX(0, file_size);
}
if ((!strcmp(ic->iformat->name, "mpeg") ||
diff --git a/libavformat/version.h b/libavformat/version.h
index 333a3a0125..58c3a74bff 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -101,5 +101,11 @@
#ifndef FF_API_NEW_STREAM
#define FF_API_NEW_STREAM (LIBAVFORMAT_VERSION_MAJOR < 54)
#endif
+#ifndef FF_API_PRELOAD
+#define FF_API_PRELOAD (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_STREAM_COPY
+#define FF_API_STREAM_COPY (LIBAVFORMAT_VERSION_MAJOR < 54)
+#endif
#endif /* AVFORMAT_VERSION_H */