mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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>
This commit is contained in:
commit
51bfaa21c8
87
avconv.c
87
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 */
|
||||
|
99
ffmpeg.c
99
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) {
|
||||
|
@ -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;
|
||||
int ret = aac_decode_init(avctx);
|
||||
|
||||
ret = aac_decode_init(avctx);
|
||||
|
||||
if (avctx->extradata_size > 0) {
|
||||
if (avctx->extradata_size > 0)
|
||||
latmctx->initialized = !ret;
|
||||
} else {
|
||||
latmctx->initialized = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -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;
|
||||
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);
|
||||
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;
|
||||
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,
|
||||
};
|
||||
|
@ -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);
|
||||
|
288
libavcodec/tta.c
288
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");
|
||||
// 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--;
|
||||
}
|
||||
|
||||
if (get_bits_left(&s->gb) < k)
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
if (k) {
|
||||
if (k > MIN_CACHE_BITS)
|
||||
return -1;
|
||||
value = (unary << k) + get_bits(&s->gb, k);
|
||||
} else
|
||||
value = unary;
|
||||
|
||||
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
|
||||
#define UNFOLD(x) (((x)&1) ? (++(x)>>1) : (-(x)>>1))
|
||||
*p = UNFOLD(value);
|
||||
|
||||
// run hybrid filter
|
||||
ttafilter_process(filter, p, 0);
|
||||
|
||||
// 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;
|
||||
}
|
||||
// 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 (get_bits_left(&s->gb) < 32)
|
||||
return -1;
|
||||
skip_bits(&s->gb, 32); // frame crc
|
||||
// extract coded value
|
||||
#define UNFOLD(x) (((x)&1) ? (++(x)>>1) : (-(x)>>1))
|
||||
*p = UNFOLD(value);
|
||||
|
||||
// run hybrid filter
|
||||
ttafilter_process(filter, p, 0);
|
||||
|
||||
// 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;
|
||||
|
||||
// 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
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 },
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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") ||
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user