/* compute nominal last_duration */
last_duration = vp->pts - is->frame_last_pts;
- if (last_duration > 0 && last_duration < is->max_frame_duration) {
+ if (!isnan(last_duration) && last_duration > 0 && last_duration < is->max_frame_duration) {
/* if duration of the last frame was sane, update last_duration in video state */
is->frame_last_duration = last_duration;
}
is->frame_timer += delay * FFMAX(1, floor((time-is->frame_timer) / delay));
SDL_LockMutex(is->pictq_mutex);
- update_video_pts(is, vp->pts, vp->pos, vp->serial);
+ if (!isnan(vp->pts))
+ update_video_pts(is, vp->pts, vp->pos, vp->serial);
SDL_UnlockMutex(is->pictq_mutex);
if (is->pictq_size > 1) {
vp = &is->pictq[is->pictq_windex];
-#if CONFIG_AVFILTER
vp->sar = src_frame->sample_aspect_ratio;
-#else
- vp->sar = av_guess_sample_aspect_ratio(is->ic, is->video_st, src_frame);
-#endif
/* alloc or resize hardware picture buffer */
if (!vp->bmp || vp->reallocate || !vp->allocated ||
if (got_picture) {
int ret = 1;
+ double dpts = NAN;
if (decoder_reorder_pts == -1) {
frame->pts = av_frame_get_best_effort_timestamp(frame);
frame->pts = frame->pkt_dts;
}
- if (frame->pts == AV_NOPTS_VALUE) {
- frame->pts = 0;
- }
+ if (frame->pts != AV_NOPTS_VALUE)
+ dpts = av_q2d(is->video_st->time_base) * frame->pts;
+
+ frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
if (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) {
SDL_LockMutex(is->pictq_mutex);
- if (is->frame_last_pts != AV_NOPTS_VALUE && frame->pts) {
+ if (is->frame_last_pts != AV_NOPTS_VALUE && frame->pts != AV_NOPTS_VALUE) {
double clockdiff = get_video_clock(is) - get_master_clock(is);
- double dpts = av_q2d(is->video_st->time_base) * frame->pts;
double ptsdiff = dpts - is->frame_last_pts;
if (!isnan(clockdiff) && fabs(clockdiff) < AV_NOSYNC_THRESHOLD &&
- ptsdiff > 0 && ptsdiff < AV_NOSYNC_THRESHOLD &&
- clockdiff + ptsdiff - is->frame_last_filter_delay < 0) {
+ !isnan(ptsdiff) && ptsdiff > 0 && ptsdiff < AV_NOSYNC_THRESHOLD &&
+ clockdiff + ptsdiff - is->frame_last_filter_delay < 0 &&
+ is->videoq.nb_packets) {
is->frame_last_dropped_pos = pkt->pos;
is->frame_last_dropped_pts = dpts;
is->frame_last_dropped_serial = *serial;
char sws_flags_str[128];
char buffersrc_args[256];
int ret;
- AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
AVFilterContext *filt_src = NULL, *filt_out = NULL, *filt_crop;
AVCodecContext *codec = is->video_st->codec;
AVRational fr = av_guess_frame_rate(is->ic, is->video_st, NULL);
- if (!buffersink_params)
- return AVERROR(ENOMEM);
-
av_opt_get_int(sws_opts, "sws_flags", 0, &sws_flags);
snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%"PRId64, sws_flags);
graph->scale_sws_opts = av_strdup(sws_flags_str);
graph)) < 0)
goto fail;
- buffersink_params->pixel_fmts = pix_fmts;
ret = avfilter_graph_create_filter(&filt_out,
avfilter_get_by_name("buffersink"),
- "ffplay_buffersink", NULL, buffersink_params, graph);
+ "ffplay_buffersink", NULL, NULL, graph);
if (ret < 0)
goto fail;
+ if ((ret = av_opt_set_int_list(filt_out, "pix_fmts", pix_fmts, AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) < 0)
+ goto fail;
+
/* SDL YUV code is not handling odd width/height for some driver
* combinations, therefore we crop the picture to an even width/height. */
if ((ret = avfilter_graph_create_filter(&filt_crop,
is->out_video_filter = filt_out;
fail:
- av_freep(&buffersink_params);
return ret;
}
int channels[2] = { 0, -1 };
AVFilterContext *filt_asrc = NULL, *filt_asink = NULL;
char asrc_args[256];
- AVABufferSinkParams *asink_params = NULL;
int ret;
avfilter_graph_free(&is->agraph);
if (ret < 0)
goto end;
- if (!(asink_params = av_abuffersink_params_alloc())) {
- ret = AVERROR(ENOMEM);
+
+ ret = avfilter_graph_create_filter(&filt_asink,
+ avfilter_get_by_name("abuffersink"), "ffplay_abuffersink",
+ NULL, NULL, is->agraph);
+ if (ret < 0)
+ goto end;
+
+ if ((ret = av_opt_set_int_list(filt_asink, "sample_fmts", sample_fmts, AV_SAMPLE_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) < 0)
+ goto end;
+ if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 1, AV_OPT_SEARCH_CHILDREN)) < 0)
goto end;
- }
- asink_params->sample_fmts = sample_fmts;
- asink_params->all_channel_counts = 1;
if (force_output_format) {
channel_layouts[0] = is->audio_tgt.channel_layout;
- asink_params->channel_layouts = channel_layouts;
- asink_params->all_channel_counts = 0;
- channels[0] = is->audio_tgt.channels;
- asink_params->channel_counts = channels;
- asink_params->all_channel_counts = 0;
- sample_rates[0] = is->audio_tgt.freq;
- asink_params->sample_rates = sample_rates;
+ channels [0] = is->audio_tgt.channels;
+ sample_rates [0] = is->audio_tgt.freq;
+ if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 0, AV_OPT_SEARCH_CHILDREN)) < 0)
+ goto end;
+ if ((ret = av_opt_set_int_list(filt_asink, "channel_layouts", channel_layouts, -1, AV_OPT_SEARCH_CHILDREN)) < 0)
+ goto end;
+ if ((ret = av_opt_set_int_list(filt_asink, "channel_counts" , channels , -1, AV_OPT_SEARCH_CHILDREN)) < 0)
+ goto end;
+ if ((ret = av_opt_set_int_list(filt_asink, "sample_rates" , sample_rates , -1, AV_OPT_SEARCH_CHILDREN)) < 0)
+ goto end;
}
- ret = avfilter_graph_create_filter(&filt_asink,
- avfilter_get_by_name("abuffersink"), "ffplay_abuffersink",
- NULL, asink_params, is->agraph);
- if (ret < 0)
- goto end;
if ((ret = configure_filtergraph(is->agraph, afilters, filt_asrc, filt_asink)) < 0)
goto end;
is->out_audio_filter = filt_asink;
end:
- av_freep(&asink_params);
if (ret < 0)
avfilter_graph_free(&is->agraph);
return ret;
last_serial = serial;
}
- frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
ret = av_buffersrc_add_frame(filt_in, frame);
if (ret < 0)
goto the_end;
if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
is->frame_last_filter_delay = 0;
- pts = frame->pts * av_q2d(filt_out->inputs[0]->time_base);
+ pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(filt_out->inputs[0]->time_base);
ret = queue_picture(is, frame, pts, av_frame_get_pkt_pos(frame), serial);
av_frame_unref(frame);
}
#else
- pts = frame->pts * av_q2d(is->video_st->time_base);
+ pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(is->video_st->time_base);
ret = queue_picture(is, frame, pts, pkt.pos, serial);
av_frame_unref(frame);
#endif
int out_count = (int64_t)wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate + 256;
int out_size = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, out_count, is->audio_tgt.fmt, 0);
int len2;
+ if (out_size < 0) {
+ fprintf(stderr, "av_samples_get_buffer_size() failed\n");
+ break;
+ }
if (wanted_nb_samples != is->frame->nb_samples) {
if (swr_set_compensation(is->swr_ctx, (wanted_nb_samples - is->frame->nb_samples) * is->audio_tgt.freq / is->frame->sample_rate,
wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate) < 0) {
is->max_frame_duration = (ic->iformat->flags & AVFMT_TS_DISCONT) ? 10.0 : 3600.0;
+ if (!window_title && (t = av_dict_get(ic->metadata, "title", NULL, 0)))
+ window_title = av_asprintf("%s - %s", t->value, input_filename);
+
/* if seeking requested, we execute it */
if (start_time != AV_NOPTS_VALUE) {
int64_t timestamp;
}
av_init_packet(&flush_pkt);
- flush_pkt.data = (char *)(intptr_t)"FLUSH";
+ flush_pkt.data = (uint8_t *)&flush_pkt;
is = stream_open(input_filename, file_iformat);
if (!is) {