struct SwrContext *swr_ctx;
double audio_current_pts;
double audio_current_pts_drift;
+ int frame_drops_early;
+ int frame_drops_late;
enum ShowMode {
SHOW_MODE_NONE = -1, SHOW_MODE_VIDEO = 0, SHOW_MODE_WAVES, SHOW_MODE_RDFT, SHOW_MODE_NB
double frame_last_pts;
double frame_last_duration;
double frame_last_dropped_pts;
+ double frame_last_returned_time;
+ double frame_last_filter_delay;
int64_t frame_last_dropped_pos;
double video_clock; ///<pts of last decoded frame / predicted pts of next decoded frame
int video_stream;
static SDL_Surface *screen;
-void exit_program(int ret)
+void av_noreturn exit_program(int ret)
{
exit(ret);
}
#if CONFIG_AVFILTER
avfilter_uninit();
#endif
+ avformat_network_deinit();
if (show_status)
printf("\n");
SDL_Quit();
if((framedrop>0 || (framedrop && is->audio_st)) && time > is->frame_timer + duration){
if(is->pictq_size > 1){
+ is->frame_drops_late++;
pictq_next_picture(is);
goto retry;
}
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 f=%"PRId64"/%"PRId64" \r",
+ printf("%7.2f A-V:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64"/%"PRId64" \r",
get_master_clock(is),
av_diff,
+ is->frame_drops_early + is->frame_drops_late,
aqsize / 1024,
vqsize / 1024,
sqsize,
double ptsdiff = dpts - is->frame_last_pts;
if (fabs(clockdiff) < AV_NOSYNC_THRESHOLD &&
ptsdiff > 0 && ptsdiff < AV_NOSYNC_THRESHOLD &&
- clockdiff + ptsdiff < 0) { //TODO: Substract approxiamte time of filter
+ clockdiff + ptsdiff - is->frame_last_filter_delay < 0) {
is->frame_last_dropped_pos = pkt->pos;
is->frame_last_dropped_pts = dpts;
+ is->frame_drops_early++;
ret = 0;
}
}
SDL_UnlockMutex(is->pictq_mutex);
}
+ if (ret)
+ is->frame_last_returned_time = av_gettime() / 1000000.0;
+
return ret;
}
return 0;
if (ret < 0) goto the_end;
+ is->frame_last_filter_delay = av_gettime() / 1000000.0 - is->frame_last_returned_time;
+ if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
+ is->frame_last_filter_delay = 0;
+
#if CONFIG_AVFILTER
if (!picref)
continue;
swr_free(&is->swr_ctx);
is->swr_ctx = swr_alloc2(NULL, is->audio_tgt_channel_layout, is->audio_tgt_fmt, is->audio_tgt_freq,
dec_channel_layout, dec->sample_fmt, dec->sample_rate,
- 0, NULL);
+ NULL, 0, NULL);
if (!is->swr_ctx || swr_init(is->swr_ctx) < 0) {
fprintf(stderr, "Cannot create sample rate converter for conversion of %d Hz %s %d channels to %d Hz %s %d channels!\n",
dec->sample_rate,
avctx->workaround_bugs = workaround_bugs;
avctx->lowres = lowres;
- if(lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE;
+ if(avctx->lowres > codec->max_lowres){
+ av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
+ codec->max_lowres);
+ avctx->lowres= codec->max_lowres;
+ }
+ if(avctx->lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE;
avctx->idct_algo= idct;
if(fast) avctx->flags2 |= CODEC_FLAG2_FAST;
avctx->skip_frame= skip_frame;
if (is->rdft) {
av_rdft_end(is->rdft);
av_freep(&is->rdft_data);
+ is->rdft = NULL;
+ is->rdft_bits = 0;
}
break;
case AVMEDIA_TYPE_VIDEO:
else
av_read_play(ic);
}
-#if CONFIG_RTSP_DEMUXER
- if (is->paused && !strcmp(ic->iformat->name, "rtsp")) {
+#if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
+ if (is->paused &&
+ (!strcmp(ic->iformat->name, "rtsp") ||
+ (ic->pb && !strncmp(input_filename, "mmsh:", 5)))) {
/* wait 10 ms to avoid trying to get another packet */
/* XXX: horrible */
SDL_Delay(10);
avfilter_register_all();
#endif
av_register_all();
+ avformat_network_init();
init_opts();