|  |  | @@ -177,6 +177,12 @@ typedef struct VideoState { | 
		
	
		
			
			|  |  |  | //    QETimer *video_timer; | 
		
	
		
			
			|  |  |  | char filename[1024]; | 
		
	
		
			
			|  |  |  | int width, height, xleft, ytop; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | int64_t faulty_pts; | 
		
	
		
			
			|  |  |  | int64_t faulty_dts; | 
		
	
		
			
			|  |  |  | int64_t last_dts_for_fault_detection; | 
		
	
		
			
			|  |  |  | int64_t last_pts_for_fault_detection; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } VideoState; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static void show_help(void); | 
		
	
	
		
			
				|  |  | @@ -216,7 +222,7 @@ static enum AVDiscard skip_idct= AVDISCARD_DEFAULT; | 
		
	
		
			
			|  |  |  | static enum AVDiscard skip_loop_filter= AVDISCARD_DEFAULT; | 
		
	
		
			
			|  |  |  | static int error_recognition = FF_ER_CAREFUL; | 
		
	
		
			
			|  |  |  | static int error_concealment = 3; | 
		
	
		
			
			|  |  |  | static int decoder_reorder_pts= 0; | 
		
	
		
			
			|  |  |  | static int decoder_reorder_pts= -1; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* current context */ | 
		
	
		
			
			|  |  |  | static int is_full_screen; | 
		
	
	
		
			
				|  |  | @@ -1155,8 +1161,8 @@ static void video_refresh_timer(void *opaque) | 
		
	
		
			
			|  |  |  | av_diff = 0; | 
		
	
		
			
			|  |  |  | if (is->audio_st && is->video_st) | 
		
	
		
			
			|  |  |  | av_diff = get_audio_clock(is) - get_video_clock(is); | 
		
	
		
			
			|  |  |  | printf("%7.2f A-V:%7.3f aq=%5dKB vq=%5dKB sq=%5dB    \r", | 
		
	
		
			
			|  |  |  | get_master_clock(is), av_diff, aqsize / 1024, vqsize / 1024, sqsize); | 
		
	
		
			
			|  |  |  | printf("%7.2f A-V:%7.3f aq=%5dKB vq=%5dKB sq=%5dB f=%Ld/%Ld   \r", | 
		
	
		
			
			|  |  |  | get_master_clock(is), av_diff, aqsize / 1024, vqsize / 1024, sqsize, is->faulty_dts, is->faulty_pts); | 
		
	
		
			
			|  |  |  | fflush(stdout); | 
		
	
		
			
			|  |  |  | last_time = cur_time; | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -1334,6 +1340,8 @@ static int video_thread(void *arg) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(pkt->data == flush_pkt.data){ | 
		
	
		
			
			|  |  |  | avcodec_flush_buffers(is->video_st->codec); | 
		
	
		
			
			|  |  |  | is->last_dts_for_fault_detection= | 
		
	
		
			
			|  |  |  | is->last_pts_for_fault_detection= INT64_MIN; | 
		
	
		
			
			|  |  |  | continue; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -1344,7 +1352,18 @@ static int video_thread(void *arg) | 
		
	
		
			
			|  |  |  | frame, &got_picture, | 
		
	
		
			
			|  |  |  | pkt); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(   (decoder_reorder_pts || pkt->dts == AV_NOPTS_VALUE) | 
		
	
		
			
			|  |  |  | if(pkt->dts != AV_NOPTS_VALUE){ | 
		
	
		
			
			|  |  |  | is->faulty_dts += pkt->dts <= is->last_dts_for_fault_detection; | 
		
	
		
			
			|  |  |  | is->last_dts_for_fault_detection= pkt->dts; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if(frame->reordered_opaque != AV_NOPTS_VALUE){ | 
		
	
		
			
			|  |  |  | is->faulty_pts += frame->reordered_opaque <= is->last_pts_for_fault_detection; | 
		
	
		
			
			|  |  |  | is->last_pts_for_fault_detection= frame->reordered_opaque; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(   (   decoder_reorder_pts==1 | 
		
	
		
			
			|  |  |  | || decoder_reorder_pts && is->faulty_pts<is->faulty_dts | 
		
	
		
			
			|  |  |  | || pkt->dts == AV_NOPTS_VALUE) | 
		
	
		
			
			|  |  |  | && frame->reordered_opaque != AV_NOPTS_VALUE) | 
		
	
		
			
			|  |  |  | pts= frame->reordered_opaque; | 
		
	
		
			
			|  |  |  | else if(pkt->dts != AV_NOPTS_VALUE) | 
		
	
	
		
			
				|  |  | @@ -2486,7 +2505,7 @@ static const OptionDef options[] = { | 
		
	
		
			
			|  |  |  | { "vismv", HAS_ARG | OPT_FUNC2 | OPT_EXPERT, {(void*)opt_vismv}, "visualize motion vectors", "" }, | 
		
	
		
			
			|  |  |  | { "fast", OPT_BOOL | OPT_EXPERT, {(void*)&fast}, "non spec compliant optimizations", "" }, | 
		
	
		
			
			|  |  |  | { "genpts", OPT_BOOL | OPT_EXPERT, {(void*)&genpts}, "generate pts", "" }, | 
		
	
		
			
			|  |  |  | { "drp", OPT_BOOL |OPT_EXPERT, {(void*)&decoder_reorder_pts}, "let decoder reorder pts", ""}, | 
		
	
		
			
			|  |  |  | { "drp", OPT_INT |OPT_EXPERT, {(void*)&decoder_reorder_pts}, "let decoder reorder pts 0=off 1=on -1=auto", ""}, | 
		
	
		
			
			|  |  |  | { "lowres", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&lowres}, "", "" }, | 
		
	
		
			
			|  |  |  | { "skiploop", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&skip_loop_filter}, "", "" }, | 
		
	
		
			
			|  |  |  | { "skipframe", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&skip_frame}, "", "" }, | 
		
	
	
		
			
				|  |  | 
 |