annotate libmpcodecs/vf_scale.c @ 5574:bdfd4b72244a

fixing vertical scaling on non mobility cards, this might have overflowed into the horizontal stuff, so perhaps it fixes the horizontal stuff too
author michael
date Fri, 12 Apr 2002 12:29:12 +0000
parents 0b301fec999a
children 1972c3475d93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
1 #include <stdio.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
2 #include <stdlib.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
3 #include <string.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
4 #include <inttypes.h>
545c13161589 swscale filter
arpi
parents:
diff changeset
5
545c13161589 swscale filter
arpi
parents:
diff changeset
6 #include "../config.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
7 #include "../mp_msg.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
8
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
9 #include "../libvo/img_format.h"
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
10 #include "../mp_image.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
11 #include "vf.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
12
545c13161589 swscale filter
arpi
parents:
diff changeset
13 #include "../libvo/fastmemcpy.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
14 #include "../postproc/swscale.h"
545c13161589 swscale filter
arpi
parents:
diff changeset
15
545c13161589 swscale filter
arpi
parents:
diff changeset
16 struct vf_priv_s {
545c13161589 swscale filter
arpi
parents:
diff changeset
17 int w,h;
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
18 unsigned int fmt;
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
19 SwsContext *ctx;
545c13161589 swscale filter
arpi
parents:
diff changeset
20 };
545c13161589 swscale filter
arpi
parents:
diff changeset
21
545c13161589 swscale filter
arpi
parents:
diff changeset
22 //===========================================================================//
545c13161589 swscale filter
arpi
parents:
diff changeset
23
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
24 static unsigned int outfmt_list[]={
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
25 IMGFMT_BGR32,
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
26 IMGFMT_BGR24,
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
27 IMGFMT_BGR16,
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
28 IMGFMT_BGR15,
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
29 IMGFMT_YV12,
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
30 IMGFMT_I420,
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
31 IMGFMT_IYUV,
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
32 NULL
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
33 };
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
34
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
35 static unsigned int find_best_out(vf_instance_t *vf){
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
36 unsigned int best=0;
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
37 unsigned int* p=outfmt_list;
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
38 // find the best outfmt:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
39 while(*p){
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
40 int ret=vf_next_query_format(vf,*p);
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
41 mp_msg(MSGT_VFILTER,MSGL_V,"scale: query(%s) -> %d\n",vo_format_name(*p),ret&3);
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
42 if(ret&2){ best=*p; break;} // no conversion -> bingo!
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
43 if(ret&1 && !best) best=*p; // best with conversion
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
44 ++p;
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
45 }
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
46 return best;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
47 }
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
48
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
49 static int config(struct vf_instance_s* vf,
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
50 int width, int height, int d_width, int d_height,
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
51 unsigned int flags, unsigned int outfmt){
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
52 unsigned int best=find_best_out(vf);
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
53 int vo_flags;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
54
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
55 if(!best){
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
56 printf("SwScale: no supported outfmt found :(\n");
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
57 return 0;
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
58 }
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
59
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
60 vo_flags=vf->next->query_format(vf->next,best);
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
61
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
62 // scaling to dwidth*d_height, if all these TRUE:
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
63 // - option -zoom
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
64 // - no other sw/hw up/down scaling avail.
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
65 // - we're after postproc
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
66 // - user didn't set w:h
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
67 if(!(vo_flags&VFCAP_POSTPROC) && (flags&4) &&
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
68 vf->priv->w<0 && vf->priv->h<0){ // -zoom
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
69 int x=(vo_flags&VFCAP_SWSCALE) ? 0 : 1;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
70 if(d_width<width || d_height<height){
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
71 // downscale!
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
72 if(vo_flags&VFCAP_HWSCALE_DOWN) x=0;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
73 } else {
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
74 // upscale:
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
75 if(vo_flags&VFCAP_HWSCALE_UP) x=0;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
76 }
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
77 if(x){
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
78 // user wants sw scaling! (-zoom)
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
79 vf->priv->w=d_width;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
80 vf->priv->h=d_height;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
81 }
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
82 }
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
83
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
84 // calculate the missing parameters:
545c13161589 swscale filter
arpi
parents:
diff changeset
85 if(vf->priv->w<=0) vf->priv->w=width;
545c13161589 swscale filter
arpi
parents:
diff changeset
86 if(vf->priv->h<=0) vf->priv->h=height;
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
87
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
88 printf("SwScale scaling %dx%d %s to %dx%d %s \n",
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
89 width,height,vo_format_name(outfmt),
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
90 vf->priv->w,vf->priv->h,vo_format_name(best));
5526
30679378f814 free old context, really use query_format
arpi
parents: 5525
diff changeset
91
30679378f814 free old context, really use query_format
arpi
parents: 5525
diff changeset
92 // free old ctx:
30679378f814 free old context, really use query_format
arpi
parents: 5525
diff changeset
93 if(vf->priv->ctx) freeSwsContext(vf->priv->ctx);
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
94
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
95 // new swscaler:
545c13161589 swscale filter
arpi
parents:
diff changeset
96 vf->priv->ctx=getSwsContextFromCmdLine(width,height,outfmt,
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
97 vf->priv->w,vf->priv->h,best);
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
98 if(!vf->priv->ctx){
545c13161589 swscale filter
arpi
parents:
diff changeset
99 // error...
545c13161589 swscale filter
arpi
parents:
diff changeset
100 printf("Couldn't init SwScaler for this setup\n");
545c13161589 swscale filter
arpi
parents:
diff changeset
101 return 0;
545c13161589 swscale filter
arpi
parents:
diff changeset
102 }
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
103 vf->priv->fmt=best;
5525
arpi
parents: 5523
diff changeset
104 return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,best);
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
105 }
545c13161589 swscale filter
arpi
parents:
diff changeset
106
545c13161589 swscale filter
arpi
parents:
diff changeset
107 static void put_image(struct vf_instance_s* vf, mp_image_t *mpi){
545c13161589 swscale filter
arpi
parents:
diff changeset
108 mp_image_t *dmpi;
545c13161589 swscale filter
arpi
parents:
diff changeset
109
545c13161589 swscale filter
arpi
parents:
diff changeset
110 // hope we'll get DR buffer:
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
111 dmpi=vf_get_image(vf->next,vf->priv->fmt,
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
112 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
545c13161589 swscale filter
arpi
parents:
diff changeset
113 vf->priv->w, vf->priv->h);
545c13161589 swscale filter
arpi
parents:
diff changeset
114
545c13161589 swscale filter
arpi
parents:
diff changeset
115 vf->priv->ctx->swScale(vf->priv->ctx,mpi->planes,mpi->stride,0,mpi->h,dmpi->planes,dmpi->stride);
545c13161589 swscale filter
arpi
parents:
diff changeset
116
5527
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
117 if(vf->priv->w==mpi->w && vf->priv->h==mpi->h){
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
118 // just conversion, no scaling -> keep postprocessing data
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
119 // this way we can apply pp filter to non-yv12 source using scaler
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
120 dmpi->qscale=mpi->qscale;
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
121 dmpi->qstride=mpi->qstride;
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
122 }
04c5047ead0c pp passtrough
arpi
parents: 5526
diff changeset
123
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
124 vf_next_put_image(vf,dmpi);
545c13161589 swscale filter
arpi
parents:
diff changeset
125 }
545c13161589 swscale filter
arpi
parents:
diff changeset
126
545c13161589 swscale filter
arpi
parents:
diff changeset
127 //===========================================================================//
545c13161589 swscale filter
arpi
parents:
diff changeset
128
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
129 // supported Input formats: YV12, I420, IYUV, YUY2, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8, Y800
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
130
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
131 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
132 switch(fmt){
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
133 case IMGFMT_YV12:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
134 case IMGFMT_I420:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
135 case IMGFMT_IYUV:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
136 case IMGFMT_YUY2:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
137 case IMGFMT_BGR32:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
138 case IMGFMT_BGR24:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
139 case IMGFMT_BGR16:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
140 case IMGFMT_BGR15:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
141 case IMGFMT_RGB32:
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
142 case IMGFMT_RGB24:
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
143 case IMGFMT_Y800: {
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
144 unsigned int best=find_best_out(vf);
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
145 int flags;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
146 if(!best) return 0; // no matching out-fmt
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
147 flags=vf_next_query_format(vf,best);
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
148 if(!(flags&3)) return 0; // huh?
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
149 if(fmt!=best) flags&=~VFCAP_CSP_SUPPORTED_BY_HW;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
150 // do not allow scaling, if we are before the PP fliter!
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
151 if(!(flags&VFCAP_POSTPROC)) flags|=VFCAP_SWSCALE;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
152 return flags;
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
153 }
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
154 }
5565
0b301fec999a capabilities support -> automatic insertion of scale, expand, pp
arpi
parents: 5527
diff changeset
155 return 0; // nomatching in-fmt
5523
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
156 }
8d55957fa018 colorspace conversion support
arpi
parents: 5522
diff changeset
157
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
158 static int open(vf_instance_t *vf, char* args){
545c13161589 swscale filter
arpi
parents:
diff changeset
159 vf->config=config;
545c13161589 swscale filter
arpi
parents:
diff changeset
160 vf->put_image=put_image;
5526
30679378f814 free old context, really use query_format
arpi
parents: 5525
diff changeset
161 vf->query_format=query_format;
5522
545c13161589 swscale filter
arpi
parents:
diff changeset
162 vf->priv=malloc(sizeof(struct vf_priv_s));
545c13161589 swscale filter
arpi
parents:
diff changeset
163 // TODO: parse args ->
545c13161589 swscale filter
arpi
parents:
diff changeset
164 vf->priv->ctx=NULL;
545c13161589 swscale filter
arpi
parents:
diff changeset
165 vf->priv->w=
545c13161589 swscale filter
arpi
parents:
diff changeset
166 vf->priv->h=-1;
545c13161589 swscale filter
arpi
parents:
diff changeset
167 if(args) sscanf(args, "%d:%d",
545c13161589 swscale filter
arpi
parents:
diff changeset
168 &vf->priv->w,
545c13161589 swscale filter
arpi
parents:
diff changeset
169 &vf->priv->h);
545c13161589 swscale filter
arpi
parents:
diff changeset
170 printf("SwScale: %d x %d\n",
545c13161589 swscale filter
arpi
parents:
diff changeset
171 vf->priv->w,
545c13161589 swscale filter
arpi
parents:
diff changeset
172 vf->priv->h);
545c13161589 swscale filter
arpi
parents:
diff changeset
173 return 1;
545c13161589 swscale filter
arpi
parents:
diff changeset
174 }
545c13161589 swscale filter
arpi
parents:
diff changeset
175
545c13161589 swscale filter
arpi
parents:
diff changeset
176 vf_info_t vf_info_scale = {
545c13161589 swscale filter
arpi
parents:
diff changeset
177 "software scaling",
545c13161589 swscale filter
arpi
parents:
diff changeset
178 "scale",
545c13161589 swscale filter
arpi
parents:
diff changeset
179 "A'rpi",
545c13161589 swscale filter
arpi
parents:
diff changeset
180 "",
545c13161589 swscale filter
arpi
parents:
diff changeset
181 open
545c13161589 swscale filter
arpi
parents:
diff changeset
182 };
545c13161589 swscale filter
arpi
parents:
diff changeset
183
545c13161589 swscale filter
arpi
parents:
diff changeset
184 //===========================================================================//