mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 12:36:41 +08: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:
		
							
								
								
									
										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) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Michael Niedermayer
					Michael Niedermayer