Mercurial > mplayer.hg
annotate libmpcodecs/vf_pp.c @ 28992:947ef23ba798
Test if create_vdp_decoder() might succeed by calling it from config()
with a small value for max_reference_frames.
This does not make automatic recovery by using software decoder possible,
but lets MPlayer fail more graciously on - actually existing - buggy
hardware that does not support certain H264 widths when using
hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on
NVIDIA G98) and if the user tries to hardware-decode more samples at
the same time than supported.
Might break playback of H264 Intra-Only samples on hardware with very
little video memory.
author | cehoyos |
---|---|
date | Sat, 21 Mar 2009 20:11:05 +0000 |
parents | df67d03dde3b |
children | 0f1b5b68af32 |
rev | line source |
---|---|
5512 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
7946 | 4 #include <inttypes.h> |
7963 | 5 #include <errno.h> |
5512 | 6 |
17012 | 7 #include "config.h" |
8 #include "mp_msg.h" | |
9 #include "cpudetect.h" | |
5512 | 10 |
28594
df67d03dde3b
Convert HAVE_MALLOC_H into a 0/1 definition, fixes the warning:
diego
parents:
28327
diff
changeset
|
11 #if HAVE_MALLOC_H |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8040
diff
changeset
|
12 #include <malloc.h> |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8040
diff
changeset
|
13 #endif |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8040
diff
changeset
|
14 |
5607 | 15 #include "img_format.h" |
16 #include "mp_image.h" | |
5512 | 17 #include "vf.h" |
28327
c39a1fd7d45c
Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents:
27341
diff
changeset
|
18 #include "libavutil/internal.h" |
18557
b7746166426c
libpostproc is not a subdirectory of libavcodec anymore.
diego
parents:
17906
diff
changeset
|
19 #include "libpostproc/postprocess.h" |
26068 | 20 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26069
diff
changeset
|
21 #ifdef CONFIG_LIBPOSTPROC_A |
26069
1318e956c092
FFmpeg now uses different (unified) #include paths.
diego
parents:
26068
diff
changeset
|
22 #define EMU_OLD |
26068 | 23 #include "libpostproc/postprocess_internal.h" |
24 #endif | |
8038 | 25 |
28327
c39a1fd7d45c
Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents:
27341
diff
changeset
|
26 #undef malloc |
c39a1fd7d45c
Fix compilation after DECLARE_ASM_CONST/DECLARE_ALIGNED moving within FFmpeg.
diego
parents:
27341
diff
changeset
|
27 |
5512 | 28 struct vf_priv_s { |
7946 | 29 int pp; |
8040 | 30 pp_mode_t *ppMode[PP_QUALITY_MAX+1]; |
7946 | 31 void *context; |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
32 unsigned int outfmt; |
5512 | 33 }; |
34 | |
35 //===========================================================================// | |
36 | |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
37 static int config(struct vf_instance_s* vf, |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
38 int width, int height, int d_width, int d_height, |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
39 unsigned int voflags, unsigned int outfmt){ |
8805 | 40 int flags= |
7985 | 41 (gCpuCaps.hasMMX ? PP_CPU_CAPS_MMX : 0) |
42 | (gCpuCaps.hasMMX2 ? PP_CPU_CAPS_MMX2 : 0) | |
8805 | 43 | (gCpuCaps.has3DNow ? PP_CPU_CAPS_3DNOW : 0); |
44 | |
45 switch(outfmt){ | |
46 case IMGFMT_444P: flags|= PP_FORMAT_444; break; | |
47 case IMGFMT_422P: flags|= PP_FORMAT_422; break; | |
48 case IMGFMT_411P: flags|= PP_FORMAT_411; break; | |
49 default: flags|= PP_FORMAT_420; break; | |
50 } | |
51 | |
52 if(vf->priv->context) pp_free_context(vf->priv->context); | |
53 vf->priv->context= pp_get_context(width, height, flags); | |
7946 | 54 |
9528 | 55 return vf_next_config(vf,width,height,d_width,d_height,voflags,outfmt); |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
56 } |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
57 |
7949 | 58 static void uninit(struct vf_instance_s* vf){ |
8038 | 59 int i; |
8040 | 60 for(i=0; i<=PP_QUALITY_MAX; i++){ |
8038 | 61 if(vf->priv->ppMode[i]) |
62 pp_free_mode(vf->priv->ppMode[i]); | |
63 } | |
7961 | 64 if(vf->priv->context) pp_free_context(vf->priv->context); |
7949 | 65 } |
66 | |
5518 | 67 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ |
68 switch(fmt){ | |
69 case IMGFMT_YV12: | |
70 case IMGFMT_I420: | |
71 case IMGFMT_IYUV: | |
8805 | 72 case IMGFMT_444P: |
73 case IMGFMT_422P: | |
74 case IMGFMT_411P: | |
75 return vf_next_query_format(vf,fmt); | |
5518 | 76 } |
77 return 0; | |
78 } | |
79 | |
5519 | 80 static int control(struct vf_instance_s* vf, int request, void* data){ |
81 switch(request){ | |
82 case VFCTRL_QUERY_MAX_PP_LEVEL: | |
8040 | 83 return PP_QUALITY_MAX; |
5519 | 84 case VFCTRL_SET_PP_LEVEL: |
7946 | 85 vf->priv->pp= *((unsigned int*)data); |
5519 | 86 return CONTROL_TRUE; |
87 } | |
88 return vf_next_control(vf,request,data); | |
89 } | |
90 | |
5512 | 91 static void get_image(struct vf_instance_s* vf, mp_image_t *mpi){ |
92 if(vf->priv->pp&0xFFFF) return; // non-local filters enabled | |
5513 | 93 if((mpi->type==MP_IMGTYPE_IPB || vf->priv->pp) && |
94 mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change | |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
95 if(!(mpi->flags&MP_IMGFLAG_ACCEPT_STRIDE) && mpi->imgfmt!=vf->priv->outfmt) |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
96 return; // colorspace differ |
5512 | 97 // ok, we can do pp in-place (or pp disabled): |
10141
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
98 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, |
16018
bdf1b4ecb906
use stored dimensions instead of visible one when (vf_)get_image is called
iive
parents:
15965
diff
changeset
|
99 mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height); |
10141
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
100 mpi->planes[0]=vf->dmpi->planes[0]; |
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
101 mpi->stride[0]=vf->dmpi->stride[0]; |
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
102 mpi->width=vf->dmpi->width; |
5512 | 103 if(mpi->flags&MP_IMGFLAG_PLANAR){ |
10141
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
104 mpi->planes[1]=vf->dmpi->planes[1]; |
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
105 mpi->planes[2]=vf->dmpi->planes[2]; |
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
106 mpi->stride[1]=vf->dmpi->stride[1]; |
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
107 mpi->stride[2]=vf->dmpi->stride[2]; |
5512 | 108 } |
109 mpi->flags|=MP_IMGFLAG_DIRECT; | |
110 } | |
111 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17463
diff
changeset
|
112 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
5512 | 113 if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ |
114 // no DR, so get a new image! hope we'll get DR buffer: | |
10141
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
115 vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, |
16471
9f516ed86916
pp_postprocess reads from target image, so request a readable one.
reimar
parents:
16018
diff
changeset
|
116 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | |
9f516ed86916
pp_postprocess reads from target image, so request a readable one.
reimar
parents:
16018
diff
changeset
|
117 MP_IMGFLAG_PREFER_ALIGNED_STRIDE | MP_IMGFLAG_READABLE, |
6875 | 118 // MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, |
119 // mpi->w,mpi->h); | |
16018
bdf1b4ecb906
use stored dimensions instead of visible one when (vf_)get_image is called
iive
parents:
15965
diff
changeset
|
120 (mpi->width+7)&(~7),(mpi->height+7)&(~7)); |
10141
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
121 vf->dmpi->w=mpi->w; vf->dmpi->h=mpi->h; // display w;h |
5512 | 122 } |
123 | |
124 if(vf->priv->pp || !(mpi->flags&MP_IMGFLAG_DIRECT)){ | |
125 // do the postprocessing! (or copy if no DR) | |
7961 | 126 pp_postprocess(mpi->planes ,mpi->stride, |
10141
7d6a854a5fe5
cleanup, use vf->dmpi rather than vf->priv->dmpi for consistency
rfelker
parents:
9931
diff
changeset
|
127 vf->dmpi->planes,vf->dmpi->stride, |
6875 | 128 (mpi->w+7)&(~7),mpi->h, |
5512 | 129 mpi->qscale, mpi->qstride, |
8038 | 130 vf->priv->ppMode[ vf->priv->pp ], vf->priv->context, |
9931 | 131 #ifdef PP_PICT_TYPE_QP2 |
9925
420640a0f6d0
passing qscale_type around so the pp code can fix the mpeg2 <<1 thing
michael
parents:
9593
diff
changeset
|
132 mpi->pict_type | (mpi->qscale_type ? PP_PICT_TYPE_QP2 : 0)); |
9931 | 133 #else |
134 mpi->pict_type); | |
135 #endif | |
5512 | 136 } |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17463
diff
changeset
|
137 return vf_next_put_image(vf,vf->dmpi, pts); |
5512 | 138 } |
139 | |
140 //===========================================================================// | |
141 | |
142 extern int divx_quality; | |
143 | |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
144 static unsigned int fmt_list[]={ |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
145 IMGFMT_YV12, |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
146 IMGFMT_I420, |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
147 IMGFMT_IYUV, |
8805 | 148 IMGFMT_444P, |
149 IMGFMT_422P, | |
150 IMGFMT_411P, | |
7127 | 151 0 |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
152 }; |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
153 |
5512 | 154 static int open(vf_instance_t *vf, char* args){ |
7946 | 155 char *endptr, *name; |
156 int i; | |
157 int hex_mode=0; | |
158 | |
5518 | 159 vf->query_format=query_format; |
5519 | 160 vf->control=control; |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
161 vf->config=config; |
5512 | 162 vf->get_image=get_image; |
163 vf->put_image=put_image; | |
7949 | 164 vf->uninit=uninit; |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
165 vf->default_caps=VFCAP_ACCEPT_STRIDE|VFCAP_POSTPROC; |
5512 | 166 vf->priv=malloc(sizeof(struct vf_priv_s)); |
7949 | 167 vf->priv->context=NULL; |
5565
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
168 |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
169 // check csp: |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
170 vf->priv->outfmt=vf_match_csp(&vf->next,fmt_list,IMGFMT_YV12); |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
171 if(!vf->priv->outfmt) return 0; // no csp match :( |
0b301fec999a
capabilities support -> automatic insertion of scale, expand, pp
arpi
parents:
5519
diff
changeset
|
172 |
5514 | 173 if(args){ |
7946 | 174 hex_mode= strtol(args, &endptr, 0); |
175 if(*endptr){ | |
176 name= args; | |
177 }else | |
178 name= NULL; | |
179 }else{ | |
180 name="de"; | |
5514 | 181 } |
7972 | 182 |
8038 | 183 #ifdef EMU_OLD |
7946 | 184 if(name){ |
8038 | 185 #endif |
8040 | 186 for(i=0; i<=PP_QUALITY_MAX; i++){ |
7961 | 187 vf->priv->ppMode[i]= pp_get_mode_by_name_and_quality(name, i); |
8038 | 188 if(vf->priv->ppMode[i]==NULL) return -1; |
7946 | 189 } |
8038 | 190 #ifdef EMU_OLD |
7946 | 191 }else{ |
192 /* hex mode for compatibility */ | |
8040 | 193 for(i=0; i<=PP_QUALITY_MAX; i++){ |
8038 | 194 PPMode *ppMode; |
195 | |
196 ppMode= (PPMode*)memalign(8, sizeof(PPMode)); | |
7946 | 197 |
8038 | 198 ppMode->lumMode= hex_mode; |
199 ppMode->chromMode= ((hex_mode&0xFF)>>4) | (hex_mode&0xFFFFFF00); | |
200 ppMode->maxTmpNoise[0]= 700; | |
201 ppMode->maxTmpNoise[1]= 1500; | |
202 ppMode->maxTmpNoise[2]= 3000; | |
203 ppMode->maxAllowedY= 234; | |
204 ppMode->minAllowedY= 16; | |
205 ppMode->baseDcDiff= 256/4; | |
206 ppMode->flatnessThreshold=40; | |
7946 | 207 |
208 vf->priv->ppMode[i]= ppMode; | |
209 } | |
210 } | |
8038 | 211 #endif |
7946 | 212 |
10756 | 213 vf->priv->pp=PP_QUALITY_MAX; |
5512 | 214 return 1; |
215 } | |
216 | |
25221 | 217 const vf_info_t vf_info_pp = { |
5512 | 218 "postprocessing", |
219 "pp", | |
220 "A'rpi", | |
221 "", | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9528
diff
changeset
|
222 open, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9528
diff
changeset
|
223 NULL |
5512 | 224 }; |
225 | |
226 //===========================================================================// | |
9426 | 227 |