ffmpeg: factor out sending frame to filters
Video doesn't exit ffmpeg on error anymore, and audio now prints an error.
This commit is contained in:
		
							parent
							
								
									b9c26aed4e
								
							
						
					
					
						commit
						825f6fbfac
					
				
							
								
								
									
										64
									
								
								ffmpeg.c
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								ffmpeg.c
									
									
									
									
									
								
							| @ -2065,9 +2065,35 @@ static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacke | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static int send_frame_to_filters(InputStream *ist, AVFrame *decoded_frame) | ||||
| { | ||||
|     int i, ret; | ||||
|     AVFrame *f; | ||||
| 
 | ||||
|     for (i = 0; i < ist->nb_filters; i++) { | ||||
|         if (i < ist->nb_filters - 1) { | ||||
|             f = ist->filter_frame; | ||||
|             ret = av_frame_ref(f, decoded_frame); | ||||
|             if (ret < 0) | ||||
|                 break; | ||||
|         } else | ||||
|             f = decoded_frame; | ||||
|         ret = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f, | ||||
|                                            AV_BUFFERSRC_FLAG_PUSH); | ||||
|         if (ret == AVERROR_EOF) | ||||
|             ret = 0; /* ignore */ | ||||
|         if (ret < 0) { | ||||
|             av_log(NULL, AV_LOG_ERROR, | ||||
|                    "Failed to inject frame into filter network: %s\n", av_err2str(ret)); | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) | ||||
| { | ||||
|     AVFrame *decoded_frame, *f; | ||||
|     AVFrame *decoded_frame; | ||||
|     AVCodecContext *avctx = ist->dec_ctx; | ||||
|     int i, ret, err = 0, resample_changed; | ||||
|     AVRational decoded_frame_tb; | ||||
| @ -2172,21 +2198,7 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) | ||||
|                                               (AVRational){1, avctx->sample_rate}, decoded_frame->nb_samples, &ist->filter_in_rescale_delta_last, | ||||
|                                               (AVRational){1, avctx->sample_rate}); | ||||
|     ist->nb_samples = decoded_frame->nb_samples; | ||||
|     for (i = 0; i < ist->nb_filters; i++) { | ||||
|         if (i < ist->nb_filters - 1) { | ||||
|             f = ist->filter_frame; | ||||
|             err = av_frame_ref(f, decoded_frame); | ||||
|             if (err < 0) | ||||
|                 break; | ||||
|         } else | ||||
|             f = decoded_frame; | ||||
|         err = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f, | ||||
|                                      AV_BUFFERSRC_FLAG_PUSH); | ||||
|         if (err == AVERROR_EOF) | ||||
|             err = 0; /* ignore */ | ||||
|         if (err < 0) | ||||
|             break; | ||||
|     } | ||||
|     err = send_frame_to_filters(ist, decoded_frame); | ||||
|     decoded_frame->pts = AV_NOPTS_VALUE; | ||||
| 
 | ||||
| fail: | ||||
| @ -2197,7 +2209,7 @@ fail: | ||||
| 
 | ||||
| static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int eof) | ||||
| { | ||||
|     AVFrame *decoded_frame, *f; | ||||
|     AVFrame *decoded_frame; | ||||
|     int i, ret = 0, err = 0, resample_changed; | ||||
|     int64_t best_effort_timestamp; | ||||
|     int64_t dts = AV_NOPTS_VALUE; | ||||
| @ -2346,23 +2358,7 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int eo | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     for (i = 0; i < ist->nb_filters; i++) { | ||||
|         if (i < ist->nb_filters - 1) { | ||||
|             f = ist->filter_frame; | ||||
|             err = av_frame_ref(f, decoded_frame); | ||||
|             if (err < 0) | ||||
|                 break; | ||||
|         } else | ||||
|             f = decoded_frame; | ||||
|         err = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f, AV_BUFFERSRC_FLAG_PUSH); | ||||
|         if (err == AVERROR_EOF) { | ||||
|             err = 0; /* ignore */ | ||||
|         } else if (err < 0) { | ||||
|             av_log(NULL, AV_LOG_FATAL, | ||||
|                    "Failed to inject frame into filter network: %s\n", av_err2str(err)); | ||||
|             exit_program(1); | ||||
|         } | ||||
|     } | ||||
|     err = send_frame_to_filters(ist, decoded_frame); | ||||
| 
 | ||||
| fail: | ||||
|     av_frame_unref(ist->filter_frame); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user