annotate libmpcodecs/vf_mcdeint.c @ 35418:cedb0ba2b5c6

Move the code to set guiInfo's Track, Chapter and Angle start values. Set them before checking whether there is any media opened, because with no media opened we clear the counters.
author ib
date Thu, 29 Nov 2012 14:11:03 +0000
parents 8ef6e54892fa
children d206960484fe
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"
33871
30f5e5cd3676 Move code for setting up libav* logging callbacks from vd_ffmpeg to a
reimar
parents: 33343
diff changeset
69 #include "av_helpers.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;
34718
8ef6e54892fa Ensure the AVDictionary is initialized.
reimar
parents: 34543
diff changeset
189 AVDictionary *opts = NULL;
18590
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=
34543
21caebba991b Switch to avcodec_alloc_context3.
reimar
parents: 34542
diff changeset
200 vf->priv->avctx_enc= avcodec_alloc_context3(enc);
18590
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;
34542
814b6fcad4b3 Set memc_only via AVDictionary.
reimar
parents: 33871
diff changeset
210 av_dict_set(&opts, "memc_only", "1", 0);
18590
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
34542
814b6fcad4b3 Set memc_only via AVDictionary.
reimar
parents: 33871
diff changeset
228 avcodec_open2(avctx_enc, enc, &opts);
814b6fcad4b3 Set memc_only via AVDictionary.
reimar
parents: 33871
diff changeset
229 av_dict_free(&opts);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
230
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
231 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
232 vf->priv->frame= avcodec_alloc_frame();
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
233
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
234 vf->priv->outbuf_size= width*height*10;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
235 vf->priv->outbuf= malloc(vf->priv->outbuf_size);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
236
32702
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
237 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
238 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
239
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
240 static void get_image(struct vf_instance *vf, mp_image_t *mpi){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
241 if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
242 return; //caused problems, dunno why
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
243 // ok, we can do pp in-place (or pp disabled):
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
244 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
245 mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
246 mpi->planes[0]=vf->dmpi->planes[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
247 mpi->stride[0]=vf->dmpi->stride[0];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
248 mpi->width=vf->dmpi->width;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
249 if(mpi->flags&MP_IMGFLAG_PLANAR){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
250 mpi->planes[1]=vf->dmpi->planes[1];
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
251 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
252 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
253 mpi->stride[2]=vf->dmpi->stride[2];
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
254 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
255 mpi->flags|=MP_IMGFLAG_DIRECT;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
256 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
257
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
258 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
259 mp_image_t *dmpi;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
260
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
261 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
262 // no DR, so get a new image! hope we'll get DR buffer:
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
263 dmpi=vf_get_image(vf->next,mpi->imgfmt,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
264 MP_IMGTYPE_TEMP,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
265 MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
266 mpi->width,mpi->height);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
267 vf_clone_mpi_attributes(dmpi, mpi);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
268 }else{
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
269 dmpi=vf->dmpi;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
270 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
271
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
272 filter(vf->priv, dmpi->planes, mpi->planes, dmpi->stride, mpi->stride, mpi->w, mpi->h);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
273
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
274 return vf_next_put_image(vf,dmpi, pts);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
275 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
276
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
277 static void uninit(struct vf_instance *vf){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
278 if(!vf->priv) return;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
279
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
280 #if 0
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
281 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
282 free(vf->priv->temp[i]);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
283 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
284 free(vf->priv->src[i]);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
285 vf->priv->src[i]= NULL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
286 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
287 #endif
18821
ac61a42feb47 Avoid crash in uninit-without-config case
reimar
parents: 18752
diff changeset
288 if (vf->priv->avctx_enc) {
18752
b1b3d79011b9 avcodec_close()
michael
parents: 18657
diff changeset
289 avcodec_close(vf->priv->avctx_enc);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
290 av_freep(&vf->priv->avctx_enc);
18821
ac61a42feb47 Avoid crash in uninit-without-config case
reimar
parents: 18752
diff changeset
291 }
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
292
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
293 free(vf->priv->outbuf);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
294 free(vf->priv);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
295 vf->priv=NULL;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
296 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
297
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
298 //===========================================================================//
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 30638
diff changeset
299 static int query_format(struct vf_instance *vf, unsigned int fmt){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
300 switch(fmt){
32702
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
301 case IMGFMT_YV12:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
302 case IMGFMT_I420:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
303 case IMGFMT_IYUV:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
304 case IMGFMT_Y800:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
305 case IMGFMT_Y8:
7af3e6f901fd Convert some tabs to whitespace to allow using MPlayer filter sourcecode in FFmpeg.
cehoyos
parents: 32537
diff changeset
306 return vf_next_query_format(vf,fmt);
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
307 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
308 return 0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
309 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
310
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
311 static int vf_open(vf_instance_t *vf, char *args){
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
312
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
313 vf->config=config;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
314 vf->put_image=put_image;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
315 vf->get_image=get_image;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
316 vf->query_format=query_format;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
317 vf->uninit=uninit;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
318 vf->priv=malloc(sizeof(struct vf_priv_s));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
319 memset(vf->priv, 0, sizeof(struct vf_priv_s));
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
320
31959
f957f330aa6d Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents: 30642
diff changeset
321 init_avcodec();
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
322
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
323 vf->priv->mode=0;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
324 vf->priv->parity= -1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
325 vf->priv->qp=1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
326
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
327 if (args) sscanf(args, "%d:%d:%d", &vf->priv->mode, &vf->priv->parity, &vf->priv->qp);
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
328
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
329 return 1;
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
330 }
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
331
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 24977
diff changeset
332 const vf_info_t vf_info_mcdeint = {
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
333 "motion compensating deinterlacer",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
334 "mcdeint",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
335 "Michael Niedermayer",
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
336 "",
30638
a7b908875c14 Rename open() vf initialization function to vf_open().
diego
parents: 29263
diff changeset
337 vf_open,
18590
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
338 NULL
2fa15de8806b Motion compensating deinterlacer
michael
parents:
diff changeset
339 };