* 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>tags/n0.9
| @@ -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 */ | |||
| @@ -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; | |||
| 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; | |||
| } | |||
| @@ -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, | |||
| }; | |||
| @@ -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); | |||
| @@ -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; | |||
| } | |||
| @@ -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 */ | |||