#include <inttypes.h>
#include <math.h>
#include <limits.h>
+#include <stdint.h>
+
#include "libavutil/avstring.h"
#include "libavutil/colorspace.h"
#include "libavutil/mathematics.h"
#if CONFIG_AVFILTER
# include "libavfilter/avfilter.h"
-# include "libavfilter/avfiltergraph.h"
# include "libavfilter/buffersink.h"
# include "libavfilter/buffersrc.h"
#endif
int reallocate;
enum AVPixelFormat pix_fmt;
-#if CONFIG_AVFILTER
- AVFilterBufferRef *picref;
-#endif
+ AVRational sar;
} VideoPicture;
typedef struct SubPicture {
#if CONFIG_AVFILTER
AVFilterContext *in_video_filter; // the first filter in the video chain
AVFilterContext *out_video_filter; // the last filter in the video chain
- int use_dr1;
- FrameBuffer *buffer_pool;
#endif
float skip_frames;
static int av_sync_type = AV_SYNC_AUDIO_MASTER;
static int64_t start_time = AV_NOPTS_VALUE;
static int64_t duration = AV_NOPTS_VALUE;
-static int debug = 0;
-static int debug_mv = 0;
static int step = 0;
static int workaround_bugs = 1;
static int fast = 0;
vp = &is->pictq[is->pictq_rindex];
if (vp->bmp) {
#if CONFIG_AVFILTER
- if (vp->picref->video->pixel_aspect.num == 0)
+ if (!vp->sar.num)
aspect_ratio = 0;
else
- aspect_ratio = av_q2d(vp->picref->video->pixel_aspect);
+ aspect_ratio = av_q2d(vp->sar);
#else
/* XXX: use variable in the frame */
}
av_rdft_calc(s->rdft, data[ch]);
}
- // least efficient way to do this, we should of course directly access it but its more than fast enough
+ /* Least efficient way to do this, we should of course
+ * directly access it but it is more than fast enough. */
for (y = 0; y < s->height; y++) {
double w = 1 / sqrt(nb_freq);
int a = sqrt(w * sqrt(data[0][2 * y + 0] * data[0][2 * y + 0] + data[0][2 * y + 1] * data[0][2 * y + 1]));
/* free all pictures */
for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++) {
vp = &is->pictq[i];
-#if CONFIG_AVFILTER
- avfilter_unref_bufferp(&vp->picref);
-#endif
if (vp->bmp) {
SDL_FreeYUVOverlay(vp->bmp);
vp->bmp = NULL;
cur_stream = NULL;
}
uninit_opts();
-#if CONFIG_AVFILTER
- avfilter_uninit();
-#endif
avformat_network_deinit();
if (show_status)
printf("\n");
SDL_FreeYUVOverlay(vp->bmp);
#if CONFIG_AVFILTER
- avfilter_unref_bufferp(&vp->picref);
-
vp->width = is->out_video_filter->inputs[0]->w;
vp->height = is->out_video_filter->inputs[0]->h;
vp->pix_fmt = is->out_video_filter->inputs[0]->format;
/* if the frame is not skipped, then display it */
if (vp->bmp) {
AVPicture pict = { { 0 } };
-#if CONFIG_AVFILTER
- avfilter_unref_bufferp(&vp->picref);
- vp->picref = src_frame->opaque;
-#endif
/* get a pointer on the bitmap */
SDL_LockYUVOverlay (vp->bmp);
static int output_picture2(VideoState *is, AVFrame *src_frame, double pts1, int64_t pos)
{
double frame_delay, pts;
+ int ret;
pts = pts1;
frame_delay += src_frame->repeat_pict * (frame_delay * 0.5);
is->video_clock += frame_delay;
- return queue_picture(is, src_frame, pts, pos);
+ ret = queue_picture(is, src_frame, pts, pos);
+ av_frame_unref(src_frame);
+ return ret;
}
static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacket *pkt)
is->skip_frames_index -= FFMAX(is->skip_frames, 1.0);
return 1;
}
-
+ av_frame_unref(frame);
}
return 0;
}
is->in_video_filter = filt_src;
is->out_video_filter = filt_out;
- if (codec->codec->capabilities & CODEC_CAP_DR1) {
- is->use_dr1 = 1;
- codec->get_buffer = codec_get_buffer;
- codec->release_buffer = codec_release_buffer;
- codec->opaque = &is->buffer_pool;
- }
-
return ret;
}
{
AVPacket pkt = { 0 };
VideoState *is = arg;
- AVFrame *frame = avcodec_alloc_frame();
+ AVFrame *frame = av_frame_alloc();
int64_t pts_int;
double pts;
int ret;
#if CONFIG_AVFILTER
AVFilterGraph *graph = avfilter_graph_alloc();
AVFilterContext *filt_out = NULL, *filt_in = NULL;
- int64_t pos;
int last_w = is->video_st->codec->width;
int last_h = is->video_st->codec->height;
for (;;) {
#if CONFIG_AVFILTER
- AVFilterBufferRef *picref;
AVRational tb;
#endif
while (is->paused && !is->videoq.abort_request)
}
frame->pts = pts_int;
- if (is->use_dr1) {
- FrameBuffer *buf = frame->opaque;
- AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
- frame->data, frame->linesize,
- AV_PERM_READ | AV_PERM_PRESERVE,
- frame->width, frame->height,
- frame->format);
-
- avfilter_copy_frame_props(fb, frame);
- fb->buf->priv = buf;
- fb->buf->free = filter_release_buffer;
-
- buf->refcount++;
- av_buffersrc_buffer(filt_in, fb);
-
- } else
- av_buffersrc_write_frame(filt_in, frame);
+ ret = av_buffersrc_add_frame(filt_in, frame);
+ if (ret < 0)
+ goto the_end;
while (ret >= 0) {
- ret = av_buffersink_read(filt_out, &picref);
+ ret = av_buffersink_get_frame(filt_out, frame);
if (ret < 0) {
ret = 0;
break;
}
- avfilter_copy_buf_props(frame, picref);
-
- pts_int = picref->pts;
+ pts_int = frame->pts;
tb = filt_out->inputs[0]->time_base;
- pos = picref->pos;
- frame->opaque = picref;
-
if (av_cmp_q(tb, is->video_st->time_base)) {
av_unused int64_t pts1 = pts_int;
pts_int = av_rescale_q(pts_int, tb, is->video_st->time_base);
is->video_st->time_base.num, is->video_st->time_base.den, pts_int);
}
pts = pts_int * av_q2d(is->video_st->time_base);
- ret = output_picture2(is, frame, pts, pos);
+ ret = output_picture2(is, frame, pts, 0);
}
#else
pts = pts_int * av_q2d(is->video_st->time_base);
if (ret < 0)
goto the_end;
+
if (step)
if (cur_stream)
stream_pause(cur_stream);
avfilter_graph_free(&graph);
#endif
av_free_packet(&pkt);
- avcodec_free_frame(&frame);
+ av_frame_free(&frame);
return 0;
}
int resample_changed, audio_resample;
if (!is->frame) {
- if (!(is->frame = avcodec_alloc_frame()))
+ if (!(is->frame = av_frame_alloc()))
return AVERROR(ENOMEM);
- } else
- avcodec_get_frame_defaults(is->frame);
+ }
if (flush_complete)
break;
opts = filter_codec_opts(codec_opts, avctx->codec_id, ic, ic->streams[stream_index], NULL);
codec = avcodec_find_decoder(avctx->codec_id);
- avctx->debug_mv = debug_mv;
- avctx->debug = debug;
avctx->workaround_bugs = workaround_bugs;
avctx->idct_algo = idct;
avctx->skip_frame = skip_frame;
if (!av_dict_get(opts, "threads", NULL, 0))
av_dict_set(&opts, "threads", "auto", 0);
+ if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
+ av_dict_set(&opts, "refcounted_frames", "1", 0);
if (!codec ||
avcodec_open2(avctx, codec, &opts) < 0)
return -1;
avresample_free(&is->avr);
av_freep(&is->audio_buf1);
is->audio_buf = NULL;
- avcodec_free_frame(&is->frame);
+ av_frame_free(&is->frame);
if (is->rdft) {
av_rdft_end(is->rdft);
ic->streams[stream_index]->discard = AVDISCARD_ALL;
avcodec_close(avctx);
-#if CONFIG_AVFILTER
- free_buffer_pool(&is->buffer_pool);
-#endif
switch (avctx->codec_type) {
case AVMEDIA_TYPE_AUDIO:
is->audio_st = NULL;
return 0;
}
-static int opt_debug(void *optctx, const char *opt, const char *arg)
-{
- av_log_set_level(99);
- debug = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
- return 0;
-}
-
-static int opt_vismv(void *optctx, const char *opt, const char *arg)
-{
- debug_mv = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
- return 0;
-}
-
static const OptionDef options[] = {
#include "cmdutils_common_opts.h"
{ "x", HAS_ARG, { .func_arg = opt_width }, "force displayed width", "width" },
{ "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
{ "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
{ "stats", OPT_BOOL | OPT_EXPERT, { &show_status }, "show status", "" },
- { "debug", HAS_ARG | OPT_EXPERT, { .func_arg = opt_debug }, "print specific debug info", "" },
{ "bug", OPT_INT | HAS_ARG | OPT_EXPERT, { &workaround_bugs }, "workaround bugs", "" },
- { "vismv", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vismv }, "visualize motion vectors", "" },
{ "fast", OPT_BOOL | OPT_EXPERT, { &fast }, "non spec compliant optimizations", "" },
{ "genpts", OPT_BOOL | OPT_EXPERT, { &genpts }, "generate pts", "" },
{ "drp", OPT_INT | HAS_ARG | OPT_EXPERT, { &decoder_reorder_pts }, "let decoder reorder pts 0=off 1=on -1=auto", ""},
}
if (!display_disable) {
-#if HAVE_SDL_VIDEO_SIZE
const SDL_VideoInfo *vi = SDL_GetVideoInfo();
fs_screen_width = vi->current_w;
fs_screen_height = vi->current_h;
-#endif
}
SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
av_init_packet(&flush_pkt);
- flush_pkt.data = "FLUSH";
+ flush_pkt.data = (uint8_t *)&flush_pkt;
cur_stream = stream_open(input_filename, file_iformat);