1/* 2 * Copyright (C) 2013 Wei Gao <weigao@multicorewareinc.com> 3 * Copyright (C) 2013 Lenny Wang 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#ifndef AVFILTER_DESHAKE_H 23#define AVFILTER_DESHAKE_H 24 25#include "config.h" 26#include "avfilter.h" 27#include "libavcodec/dsputil.h" 28#include "transform.h" 29#if CONFIG_OPENCL 30#include "libavutil/opencl.h" 31#endif 32 33 34enum SearchMethod { 35 EXHAUSTIVE, ///< Search all possible positions 36 SMART_EXHAUSTIVE, ///< Search most possible positions (faster) 37 SEARCH_COUNT 38}; 39 40typedef struct { 41 int x; ///< Horizontal shift 42 int y; ///< Vertical shift 43} IntMotionVector; 44 45typedef struct { 46 double x; ///< Horizontal shift 47 double y; ///< Vertical shift 48} MotionVector; 49 50typedef struct { 51 MotionVector vector; ///< Motion vector 52 double angle; ///< Angle of rotation 53 double zoom; ///< Zoom percentage 54} Transform; 55 56#if CONFIG_OPENCL 57 58typedef struct { 59 cl_command_queue command_queue; 60 cl_program program; 61 cl_kernel kernel_luma; 62 cl_kernel kernel_chroma; 63 int in_plane_size[8]; 64 int out_plane_size[8]; 65 int plane_num; 66 cl_mem cl_inbuf; 67 size_t cl_inbuf_size; 68 cl_mem cl_outbuf; 69 size_t cl_outbuf_size; 70} DeshakeOpenclContext; 71 72#endif 73 74typedef struct { 75 const AVClass *class; 76 AVFrame *ref; ///< Previous frame 77 int rx; ///< Maximum horizontal shift 78 int ry; ///< Maximum vertical shift 79 int edge; ///< Edge fill method 80 int blocksize; ///< Size of blocks to compare 81 int contrast; ///< Contrast threshold 82 int search; ///< Motion search method 83 AVCodecContext *avctx; 84 DSPContext c; ///< Context providing optimized SAD methods 85 Transform last; ///< Transform from last frame 86 int refcount; ///< Number of reference frames (defines averaging window) 87 FILE *fp; 88 Transform avg; 89 int cw; ///< Crop motion search to this box 90 int ch; 91 int cx; 92 int cy; 93 char *filename; ///< Motion search detailed log filename 94 int opencl; 95#if CONFIG_OPENCL 96 DeshakeOpenclContext opencl_ctx; 97#endif 98 int (* transform)(AVFilterContext *ctx, int width, int height, int cw, int ch, 99 const float *matrix_y, const float *matrix_uv, enum InterpolateMethod interpolate, 100 enum FillMethod fill, AVFrame *in, AVFrame *out); 101} DeshakeContext; 102 103#endif /* AVFILTER_DESHAKE_H */ 104