annotate libmpcodecs/vf_mcdeint.c @ 33771:6e774a02d00c

Remove gtkClearStruct code from mplayer() in interface.c. Move it as static function guiInfoMediumClear() where it is used and rename the symbolic constants used with this code.
author ib
date Sat, 09 Jul 2011 11:48:13 +0000
parents 847e0d6aa196
children 30f5e5cd3676
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
1 /*
26727
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
2 * Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at>
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
3 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
4 * This file is part of MPlayer.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
5 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
7 * it under the terms of the GNU General Public License as published by
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
9 * (at your option) any later version.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
10 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
14 * GNU General Public License for more details.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
15 *
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
16 * You should have received a copy of the GNU General Public License along
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
82601a38e2a7 Use standard license headers.
diego
parents: 25221
diff changeset
19 */
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
20
18592
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
21
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
22 /*
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
23 Known Issues:
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
24 * The motion estimation is somewhat at the mercy of the input, if the input
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
25 frames are created purely based on spatial interpolation then for example
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
26 a thin black line or another random and not interpolateable pattern
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
27 will cause problems
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
28 Note: completly ignoring the "unavailable" lines during motion estimation
18592
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
29 didnt look any better, so the most obvious solution would be to improve
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
30 tfields or penalize problematic motion vectors ...
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
31
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
32 * If non iterative ME is used then snow currently ignores the OBMC window
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
33 and as a result sometimes creates artifacts
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
34
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
35 * only past frames are used, we should ideally use future frames too, something
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29087
diff changeset
36 like filtering the whole movie in forward and then backward direction seems
18592
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
37 like a interresting idea but the current filter framework is FAR from
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
38 supporting such things
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
39
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
40 * combining the motion compensated image with the input image also isnt
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
41 as trivial as it seems, simple blindly taking even lines from one and
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
42 odd ones from the other doesnt work at all as ME/MC sometimes simple
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
43 has nothing in the previous frames which matches the current, the current
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
44 algo has been found by trial and error and almost certainly can be
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
45 improved ...
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
46 */
500f57bf5c6f known issues and notes
michael
parents: 18590
diff changeset
47
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
48 #include <stdio.h>
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
49 #include <stdlib.h>
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
50 #include <string.h>
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
51 #include <inttypes.h>
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
52 #include <math.h>
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
53
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
54 #include "mp_msg.h"
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
55 #include "cpudetect.h"
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
56
28329
ed42e982e79f Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 26727
diff changeset
57 #include "libavutil/internal.h"
24977
1e25755bc0c4 Add missing header files, fixes the warnings:
diego
parents: 23373
diff changeset
58 #include "libavutil/intreadwrite.h"
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
59 #include "libavcodec/avcodec.h"
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
60 #include "libavcodec/dsputil.h"
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
61
28329
ed42e982e79f Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 26727
diff changeset
62 #undef fprintf
ed42e982e79f Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 26727
diff changeset
63 #undef free
ed42e982e79f Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 26727
diff changeset
64 #undef malloc
ed42e982e79f Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents: 26727
diff changeset
65
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
66 #include "img_format.h"
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
67 #include "mp_image.h"
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
68 #include "vf.h"
31959
f957f330aa6d Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents: 30642
diff changeset
69 #include "vd_ffmpeg.h"
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
70
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
71 #define MIN(a,b) ((a) > (b) ? (b) : (a))
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
72 #define MAX(a,b) ((a) < (b) ? (b) : (a))
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
73 #define ABS(a) ((a) > 0 ? (a) : (-(a)))
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
74
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
75 //===========================================================================//
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
76
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
77 struct vf_priv_s {
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
78 int mode;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
79 int qp;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
80 int parity;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
81 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
82 int temp_stride[3];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
83 uint8_t *src[3];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
84 int16_t *temp[3];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
85 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
86 int outbuf_size;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
87 uint8_t *outbuf;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
88 AVCodecContext *avctx_enc;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
89 AVFrame *frame;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
90 AVFrame *frame_dec;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
91 };
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
92
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
93 static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height){
18657
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
94 int x, y, i;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
95
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
96 for(i=0; i<3; i++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
97 p->frame->data[i]= src[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
98 p->frame->linesize[i]= src_stride[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
99 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
100
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
101 p->avctx_enc->me_cmp=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
102 p->avctx_enc->me_sub_cmp= FF_CMP_SAD /*| (p->parity ? FF_CMP_ODD : FF_CMP_EVEN)*/;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
103 p->frame->quality= p->qp*FF_QP2LAMBDA;
33343
847e0d6aa196 Remove unused variable for FFmpeg encode result.
reimar
parents: 32702
diff changeset
104 avcodec_encode_video(p->avctx_enc, p->outbuf, p->outbuf_size, p->frame);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
105 p->frame_dec = p->avctx_enc->coded_frame;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
106
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
107 for(i=0; i<3; i++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
108 int is_chroma= !!i;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
109 int w= width >>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
110 int h= height>>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
111 int fils= p->frame_dec->linesize[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
112 int srcs= src_stride[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
113
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
114 for(y=0; y<h; y++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
115 if((y ^ p->parity) & 1){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
116 for(x=0; x<w; x++){
18648
7cc939d4a9e2 filter left & right edges too (yeah the code is lame i know...)
michael
parents: 18647
diff changeset
117 if((x-2)+(y-1)*w>=0 && (x+2)+(y+1)*w<w*h){ //FIXME either alloc larger images or optimize this
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
118 uint8_t *filp= &p->frame_dec->data[i][x + y*fils];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
119 uint8_t *srcp= &src[i][x + y*srcs];
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
120 int diff0= filp[-fils] - srcp[-srcs];
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
121 int diff1= filp[+fils] - srcp[+srcs];
18657
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
122 int spatial_score= ABS(srcp[-srcs-1] - srcp[+srcs-1])
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
123 +ABS(srcp[-srcs ] - srcp[+srcs ])
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
124 +ABS(srcp[-srcs+1] - srcp[+srcs+1]) - 1;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
125 int temp= filp[0];
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
126
18657
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
127 #define CHECK(j)\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
128 { int score= ABS(srcp[-srcs-1+j] - srcp[+srcs-1-j])\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
129 + ABS(srcp[-srcs +j] - srcp[+srcs -j])\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
130 + ABS(srcp[-srcs+1+j] - srcp[+srcs+1-j]);\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
131 if(score < spatial_score){\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
132 spatial_score= score;\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
133 diff0= filp[-fils+j] - srcp[-srcs+j];\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
134 diff1= filp[+fils-j] - srcp[+srcs-j];
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
135
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
136 CHECK(-1) CHECK(-2) }} }}
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
137 CHECK( 1) CHECK( 2) }} }}
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
138 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
139 if((diff0 ^ diff1) > 0){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
140 int mindiff= ABS(diff0) > ABS(diff1) ? diff1 : diff0;
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
141 temp-= mindiff;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
142 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
143 #elif 1
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
144 if(diff0 + diff1 > 0)
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
145 temp-= (diff0 + diff1 - ABS( ABS(diff0) - ABS(diff1) )/2)/2;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
146 else
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
147 temp-= (diff0 + diff1 + ABS( ABS(diff0) - ABS(diff1) )/2)/2;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
148 #else
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
149 temp-= (diff0 + diff1)/2;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
150 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
151 #if 1
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
152 filp[0]=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
153 dst[i][x + y*dst_stride[i]]= temp > 255U ? ~(temp>>31) : temp;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
154 #else
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
155 dst[i][x + y*dst_stride[i]]= filp[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
156 filp[0]= temp > 255U ? ~(temp>>31) : temp;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
157 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
158 }else
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
159 dst[i][x + y*dst_stride[i]]= p->frame_dec->data[i][x + y*fils];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
160 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
161 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
162 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
163 for(y=0; y<h; y++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
164 if(!((y ^ p->parity) & 1)){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
165 for(x=0; x<w; x++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
166 #if 1
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
167 p->frame_dec->data[i][x + y*fils]=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
168 dst[i][x + y*dst_stride[i]]= src[i][x + y*srcs];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
169 #else
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
170 dst[i][x + y*dst_stride[i]]= p->frame_dec->data[i][x + y*fils];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
171 p->frame_dec->data[i][x + y*fils]= src[i][x + y*srcs];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
172 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
173 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
174 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
175 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
176 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
177 p->parity ^= 1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
178
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
179 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
180
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
181 static int config(struct vf_instance *vf,
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
182 int width, int height, int d_width, int d_height,
32702
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
183 unsigned int flags, unsigned int outfmt){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
184 int i;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
185 AVCodec *enc= avcodec_find_encoder(CODEC_ID_SNOW);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
186
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
187 for(i=0; i<3; i++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
188 AVCodecContext *avctx_enc;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
189 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
190 int is_chroma= !!i;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
191 int w= ((width + 31) & (~31))>>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
192 int h= ((height + 31) & (~31))>>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
193
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
194 vf->priv->temp_stride[i]= w;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
195 vf->priv->temp[i]= malloc(vf->priv->temp_stride[i]*h*sizeof(int16_t));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
196 vf->priv->src [i]= malloc(vf->priv->temp_stride[i]*h*sizeof(uint8_t));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
197 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
198 avctx_enc=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
199 vf->priv->avctx_enc= avcodec_alloc_context();
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
200 avctx_enc->width = width;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
201 avctx_enc->height = height;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
202 avctx_enc->time_base= (AVRational){1,25}; // meaningless
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
203 avctx_enc->gop_size = 300;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
204 avctx_enc->max_b_frames= 0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
205 avctx_enc->pix_fmt = PIX_FMT_YUV420P;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
206 avctx_enc->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_LOW_DELAY;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
207 avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
208 avctx_enc->global_quality= 1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
209 avctx_enc->flags2= CODEC_FLAG2_MEMC_ONLY;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
210 avctx_enc->me_cmp=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
211 avctx_enc->me_sub_cmp= FF_CMP_SAD; //SSE;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
212 avctx_enc->mb_cmp= FF_CMP_SSE;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
213
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
214 switch(vf->priv->mode){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
215 case 3:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
216 avctx_enc->refs= 3;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
217 case 2:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
218 avctx_enc->me_method= ME_ITER;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
219 case 1:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
220 avctx_enc->flags |= CODEC_FLAG_4MV;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
221 avctx_enc->dia_size=2;
22283
bc9e95184521 cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents: 18821
diff changeset
222 // avctx_enc->mb_decision = MB_DECISION_RD;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
223 case 0:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
224 avctx_enc->flags |= CODEC_FLAG_QPEL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
225 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
226
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
227 avcodec_open(avctx_enc, enc);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
228
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
229 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
230 vf->priv->frame= avcodec_alloc_frame();
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
231
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
232 vf->priv->outbuf_size= width*height*10;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
233 vf->priv->outbuf= malloc(vf->priv->outbuf_size);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
234
32702
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
235 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
236 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
237
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
238 static void get_image(struct vf_instance *vf, mp_image_t *mpi){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
239 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
240 return; //caused problems, dunno why
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
241 // ok, we can do pp in-place (or pp disabled):
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
242 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
243 mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
244 mpi->planes[0]=vf->dmpi->planes[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
245 mpi->stride[0]=vf->dmpi->stride[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
246 mpi->width=vf->dmpi->width;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
247 if(mpi->flags&MP_IMGFLAG_PLANAR){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
248 mpi->planes[1]=vf->dmpi->planes[1];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
249 mpi->planes[2]=vf->dmpi->planes[2];
32702
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
250 mpi->stride[1]=vf->dmpi->stride[1];
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
251 mpi->stride[2]=vf->dmpi->stride[2];
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
252 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
253 mpi->flags|=MP_IMGFLAG_DIRECT;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
254 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
255
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
256 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
257 mp_image_t *dmpi;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
258
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
259 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
260 // no DR, so get a new image! hope we'll get DR buffer:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
261 dmpi=vf_get_image(vf->next,mpi->imgfmt,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
262 MP_IMGTYPE_TEMP,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
263 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
264 mpi->width,mpi->height);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
265 vf_clone_mpi_attributes(dmpi, mpi);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
266 }else{
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
267 dmpi=vf->dmpi;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
268 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
269
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
270 filter(vf->priv, dmpi->planes, mpi->planes, dmpi->stride, mpi->stride, mpi->w, mpi->h);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
271
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
272 return vf_next_put_image(vf,dmpi, pts);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
273 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
274
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
275 static void uninit(struct vf_instance *vf){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
276 if(!vf->priv) return;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
277
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
278 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
279 for(i=0; i<3; i++){
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31959
diff changeset
280 free(vf->priv->temp[i]);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
281 vf->priv->temp[i]= NULL;
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31959
diff changeset
282 free(vf->priv->src[i]);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
283 vf->priv->src[i]= NULL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
284 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
285 #endif
18821
ac61a42feb47 Avoid crash in uninit-without-config case
reimar
parents: 18752
diff changeset
286 if (vf->priv->avctx_enc) {
18752
b1b3d79011b9 avcodec_close()
michael
parents: 18657
diff changeset
287 avcodec_close(vf->priv->avctx_enc);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
288 av_freep(&vf->priv->avctx_enc);
18821
ac61a42feb47 Avoid crash in uninit-without-config case
reimar
parents: 18752
diff changeset
289 }
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
290
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
291 free(vf->priv->outbuf);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
292 free(vf->priv);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
293 vf->priv=NULL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
294 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
295
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
296 //===========================================================================//
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
297 static int query_format(struct vf_instance *vf, unsigned int fmt){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
298 switch(fmt){
32702
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
299 case IMGFMT_YV12:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
300 case IMGFMT_I420:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
301 case IMGFMT_IYUV:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
302 case IMGFMT_Y800:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
303 case IMGFMT_Y8:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
304 return vf_next_query_format(vf,fmt);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
305 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
306 return 0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
307 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
308
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
309 static int vf_open(vf_instance_t *vf, char *args){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
310
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
311 vf->config=config;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
312 vf->put_image=put_image;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
313 vf->get_image=get_image;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
314 vf->query_format=query_format;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
315 vf->uninit=uninit;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
316 vf->priv=malloc(sizeof(struct vf_priv_s));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
317 memset(vf->priv, 0, sizeof(struct vf_priv_s));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
318
31959
f957f330aa6d Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents: 30642
diff changeset
319 init_avcodec();
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
320
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
321 vf->priv->mode=0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
322 vf->priv->parity= -1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
323 vf->priv->qp=1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
324
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
325 if (args) sscanf(args, "%d:%d:%d", &vf->priv->mode, &vf->priv->parity, &vf->priv->qp);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
326
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
327 return 1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
328 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
329
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24977
diff changeset
330 const vf_info_t vf_info_mcdeint = {
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
331 "motion compensating deinterlacer",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
332 "mcdeint",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
333 "Michael Niedermayer",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
334 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
335 vf_open,
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
336 NULL
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
337 };