annotate libmpcodecs/vf_mcdeint.c @ 32282:606e4157cd4c

Split alloc and init of context so that parameters can be set in the context instead of requireing being passed through function parameters. This also makes sws work with AVOptions.
author michael
date Sun, 26 Sep 2010 19:33:57 +0000
parents f957f330aa6d
children 8fa2f43cb760
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 int out_size;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
96
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
97 for(i=0; i<3; i++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
98 p->frame->data[i]= src[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
99 p->frame->linesize[i]= src_stride[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
100 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
101
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
102 p->avctx_enc->me_cmp=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
103 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
104 p->frame->quality= p->qp*FF_QP2LAMBDA;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
105 out_size = avcodec_encode_video(p->avctx_enc, p->outbuf, p->outbuf_size, p->frame);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
106 p->frame_dec = p->avctx_enc->coded_frame;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
107
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
108 for(i=0; i<3; i++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
109 int is_chroma= !!i;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
110 int w= width >>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
111 int h= height>>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
112 int fils= p->frame_dec->linesize[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
113 int srcs= src_stride[i];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
114
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
115 for(y=0; y<h; y++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
116 if((y ^ p->parity) & 1){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
117 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
118 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
119 uint8_t *filp= &p->frame_dec->data[i][x + y*fils];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
120 uint8_t *srcp= &src[i][x + y*srcs];
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
121 int diff0= filp[-fils] - srcp[-srcs];
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
122 int diff1= filp[+fils] - srcp[+srcs];
18657
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
123 int spatial_score= ABS(srcp[-srcs-1] - srcp[+srcs-1])
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
124 +ABS(srcp[-srcs ] - srcp[+srcs ])
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
125 +ABS(srcp[-srcs+1] - srcp[+srcs+1]) - 1;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
126 int temp= filp[0];
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
127
18657
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
128 #define CHECK(j)\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
129 { int score= ABS(srcp[-srcs-1+j] - srcp[+srcs-1-j])\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
130 + ABS(srcp[-srcs +j] - srcp[+srcs -j])\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
131 + ABS(srcp[-srcs+1+j] - srcp[+srcs+1-j]);\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
132 if(score < spatial_score){\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
133 spatial_score= score;\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
134 diff0= filp[-fils+j] - srcp[-srcs+j];\
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
135 diff1= filp[+fils-j] - srcp[+srcs-j];
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
136
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
137 CHECK(-1) CHECK(-2) }} }}
26f54fad099c better spatial interpolation
michael
parents: 18648
diff changeset
138 CHECK( 1) CHECK( 2) }} }}
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
139 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
140 if((diff0 ^ diff1) > 0){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
141 int mindiff= ABS(diff0) > ABS(diff1) ? diff1 : diff0;
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
142 temp-= mindiff;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
143 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
144 #elif 1
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
145 if(diff0 + diff1 > 0)
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
146 temp-= (diff0 + diff1 - ABS( ABS(diff0) - ABS(diff1) )/2)/2;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
147 else
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
148 temp-= (diff0 + diff1 + ABS( ABS(diff0) - ABS(diff1) )/2)/2;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
149 #else
18647
c921020fd8bd improved mc+src merge code
michael
parents: 18592
diff changeset
150 temp-= (diff0 + diff1)/2;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
151 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
152 #if 1
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
153 filp[0]=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
154 dst[i][x + y*dst_stride[i]]= temp > 255U ? ~(temp>>31) : temp;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
155 #else
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
156 dst[i][x + y*dst_stride[i]]= filp[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
157 filp[0]= temp > 255U ? ~(temp>>31) : temp;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
158 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
159 }else
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
160 dst[i][x + y*dst_stride[i]]= p->frame_dec->data[i][x + y*fils];
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 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
164 for(y=0; y<h; y++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
165 if(!((y ^ p->parity) & 1)){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
166 for(x=0; x<w; x++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
167 #if 1
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
168 p->frame_dec->data[i][x + y*fils]=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
169 dst[i][x + y*dst_stride[i]]= src[i][x + y*srcs];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
170 #else
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
171 dst[i][x + y*dst_stride[i]]= p->frame_dec->data[i][x + y*fils];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
172 p->frame_dec->data[i][x + y*fils]= src[i][x + y*srcs];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
173 #endif
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 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
178 p->parity ^= 1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
179
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
180 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
181
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
182 static int config(struct vf_instance *vf,
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
183 int width, int height, int d_width, int d_height,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
184 unsigned int flags, unsigned int outfmt){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
185 int i;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
186 AVCodec *enc= avcodec_find_encoder(CODEC_ID_SNOW);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
187
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
188 for(i=0; i<3; i++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
189 AVCodecContext *avctx_enc;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
190 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
191 int is_chroma= !!i;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
192 int w= ((width + 31) & (~31))>>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
193 int h= ((height + 31) & (~31))>>is_chroma;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
194
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
195 vf->priv->temp_stride[i]= w;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
196 vf->priv->temp[i]= malloc(vf->priv->temp_stride[i]*h*sizeof(int16_t));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
197 vf->priv->src [i]= malloc(vf->priv->temp_stride[i]*h*sizeof(uint8_t));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
198 #endif
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
199 avctx_enc=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
200 vf->priv->avctx_enc= avcodec_alloc_context();
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
201 avctx_enc->width = width;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
202 avctx_enc->height = height;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
203 avctx_enc->time_base= (AVRational){1,25}; // meaningless
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
204 avctx_enc->gop_size = 300;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
205 avctx_enc->max_b_frames= 0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
206 avctx_enc->pix_fmt = PIX_FMT_YUV420P;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
207 avctx_enc->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_LOW_DELAY;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
208 avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
209 avctx_enc->global_quality= 1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
210 avctx_enc->flags2= CODEC_FLAG2_MEMC_ONLY;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
211 avctx_enc->me_cmp=
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
212 avctx_enc->me_sub_cmp= FF_CMP_SAD; //SSE;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
213 avctx_enc->mb_cmp= FF_CMP_SSE;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
214
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
215 switch(vf->priv->mode){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
216 case 3:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
217 avctx_enc->refs= 3;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
218 case 2:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
219 avctx_enc->me_method= ME_ITER;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
220 case 1:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
221 avctx_enc->flags |= CODEC_FLAG_4MV;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
222 avctx_enc->dia_size=2;
22283
bc9e95184521 cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents: 18821
diff changeset
223 // avctx_enc->mb_decision = MB_DECISION_RD;
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
224 case 0:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
225 avctx_enc->flags |= CODEC_FLAG_QPEL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
226 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
227
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
228 avcodec_open(avctx_enc, enc);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
229
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
230 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
231 vf->priv->frame= avcodec_alloc_frame();
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
232
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
233 vf->priv->outbuf_size= width*height*10;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
234 vf->priv->outbuf= malloc(vf->priv->outbuf_size);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
235
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
236 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
237 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
238
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
239 static void get_image(struct vf_instance *vf, mp_image_t *mpi){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
240 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
241 return; //caused problems, dunno why
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
242 // ok, we can do pp in-place (or pp disabled):
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
243 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
244 mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
245 mpi->planes[0]=vf->dmpi->planes[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
246 mpi->stride[0]=vf->dmpi->stride[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
247 mpi->width=vf->dmpi->width;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
248 if(mpi->flags&MP_IMGFLAG_PLANAR){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
249 mpi->planes[1]=vf->dmpi->planes[1];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
250 mpi->planes[2]=vf->dmpi->planes[2];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
251 mpi->stride[1]=vf->dmpi->stride[1];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
252 mpi->stride[2]=vf->dmpi->stride[2];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
253 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
254 mpi->flags|=MP_IMGFLAG_DIRECT;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
255 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
256
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
257 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
258 mp_image_t *dmpi;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
259
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
260 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
261 // no DR, so get a new image! hope we'll get DR buffer:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
262 dmpi=vf_get_image(vf->next,mpi->imgfmt,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
263 MP_IMGTYPE_TEMP,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
264 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
265 mpi->width,mpi->height);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
266 vf_clone_mpi_attributes(dmpi, mpi);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
267 }else{
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
268 dmpi=vf->dmpi;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
269 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
270
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
271 filter(vf->priv, dmpi->planes, mpi->planes, dmpi->stride, mpi->stride, mpi->w, mpi->h);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
272
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
273 return vf_next_put_image(vf,dmpi, pts);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
274 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
275
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
276 static void uninit(struct vf_instance *vf){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
277 if(!vf->priv) return;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
278
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
279 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
280 for(i=0; i<3; i++){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
281 if(vf->priv->temp[i]) free(vf->priv->temp[i]);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
282 vf->priv->temp[i]= NULL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
283 if(vf->priv->src[i]) free(vf->priv->src[i]);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
284 vf->priv->src[i]= NULL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
285 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
286 #endif
18821
ac61a42feb47 Avoid crash in uninit-without-config case
reimar
parents: 18752
diff changeset
287 if (vf->priv->avctx_enc) {
18752
b1b3d79011b9 avcodec_close()
michael
parents: 18657
diff changeset
288 avcodec_close(vf->priv->avctx_enc);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
289 av_freep(&vf->priv->avctx_enc);
18821
ac61a42feb47 Avoid crash in uninit-without-config case
reimar
parents: 18752
diff changeset
290 }
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
291
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
292 free(vf->priv->outbuf);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
293 free(vf->priv);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
294 vf->priv=NULL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
295 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
296
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
297 //===========================================================================//
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
298 static int query_format(struct vf_instance *vf, unsigned int fmt){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
299 switch(fmt){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
300 case IMGFMT_YV12:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
301 case IMGFMT_I420:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
302 case IMGFMT_IYUV:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
303 case IMGFMT_Y800:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
304 case IMGFMT_Y8:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
305 return vf_next_query_format(vf,fmt);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
306 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
307 return 0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
308 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
309
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
310 static int vf_open(vf_instance_t *vf, char *args){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
311
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
312 vf->config=config;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
313 vf->put_image=put_image;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
314 vf->get_image=get_image;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
315 vf->query_format=query_format;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
316 vf->uninit=uninit;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
317 vf->priv=malloc(sizeof(struct vf_priv_s));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
318 memset(vf->priv, 0, sizeof(struct vf_priv_s));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
319
31959
f957f330aa6d Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents: 30642
diff changeset
320 init_avcodec();
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
321
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
322 vf->priv->mode=0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
323 vf->priv->parity= -1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
324 vf->priv->qp=1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
325
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
326 if (args) sscanf(args, "%d:%d:%d", &vf->priv->mode, &vf->priv->parity, &vf->priv->qp);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
327
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
328 return 1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
329 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
330
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24977
diff changeset
331 const vf_info_t vf_info_mcdeint = {
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
332 "motion compensating deinterlacer",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
333 "mcdeint",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
334 "Michael Niedermayer",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
335 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
336 vf_open,
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
337 NULL
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
338 };