annotate libmpcodecs/vf_rotate.c @ 21698:009635b12924

Pass quant tables to next filters Fix problem when softskip is before pp. It disabled the pp filter (with no warning), since pp needs the quant tables. pach by Trent Piepho % xyzzy A speakeasy P org % Original thread: date Dec 5, 2006 11:40 AM subject [MPlayer-dev-eng] softskip doesn't copy quant tables
author gpoirier
date Thu, 21 Dec 2006 14:59:39 +0000
parents 497ebe3ecc2b
children f8d4f8eff72b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
1 #include <stdio.h>
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
2 #include <stdlib.h>
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
3 #include <string.h>
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
4 #include <inttypes.h>
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
5
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9593
diff changeset
6 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9593
diff changeset
7 #include "mp_msg.h"
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
8
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
9 #include "img_format.h"
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
10 #include "mp_image.h"
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
11 #include "vf.h"
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
12
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9593
diff changeset
13 #include "libvo/fastmemcpy.h"
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
14
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
15 struct vf_priv_s {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
16 int direction;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
17 };
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
18
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
19 static void rotate(unsigned char* dst,unsigned char* src,int dststride,int srcstride,int w,int h,int bpp,int dir){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
20 int y;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
21 if(dir&1){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
22 src+=srcstride*(w-1);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
23 srcstride*=-1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
24 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
25 if(dir&2){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
26 dst+=dststride*(h-1);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
27 dststride*=-1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
28 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
29
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
30 for(y=0;y<h;y++){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
31 int x;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
32 switch(bpp){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
33 case 1:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
34 for(x=0;x<w;x++) dst[x]=src[y+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
35 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
36 case 2:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
37 for(x=0;x<w;x++) *((short*)(dst+x*2))=*((short*)(src+y*2+x*srcstride));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
38 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
39 case 3:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
40 for(x=0;x<w;x++){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
41 dst[x*3+0]=src[0+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
42 dst[x*3+1]=src[1+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
43 dst[x*3+2]=src[2+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
44 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
45 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
46 case 4:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
47 for(x=0;x<w;x++) *((int*)(dst+x*4))=*((int*)(src+y*4+x*srcstride));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
48 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
49 dst+=dststride;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
50 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
51 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
52
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
53 //===========================================================================//
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
54
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
55 static int config(struct vf_instance_s* vf,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
56 int width, int height, int d_width, int d_height,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
57 unsigned int flags, unsigned int outfmt){
7871
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
58 if (vf->priv->direction & 4) {
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
59 if (width<height) vf->priv->direction&=3;
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
60 }
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
61 if (vf->priv->direction & 4){
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
62 vf->put_image=vf_next_put_image; // passthru mode!
8367
14af7d96df34 Fix draw_slice() in passthrough mode.
arpi
parents: 7871
diff changeset
63 if (vf->next->draw_slice) vf->draw_slice=vf_next_draw_slice;
14af7d96df34 Fix draw_slice() in passthrough mode.
arpi
parents: 7871
diff changeset
64 /* FIXME: this should be in an other procedure in vf.c; that should always check
14af7d96df34 Fix draw_slice() in passthrough mode.
arpi
parents: 7871
diff changeset
65 whether the filter after the passthrough one still (not)supports slices */
7871
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
66 return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
67 }
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
68 return vf_next_config(vf,height,width,d_height,d_width,flags,outfmt);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
69 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
70
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
71 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
72 mp_image_t *dmpi;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
73
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
74 // hope we'll get DR buffer:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
75 dmpi=vf_get_image(vf->next,mpi->imgfmt,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
76 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
77 mpi->h, mpi->w);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
78
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
79 if(mpi->flags&MP_IMGFLAG_PLANAR){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
80 rotate(dmpi->planes[0],mpi->planes[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
81 dmpi->stride[0],mpi->stride[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
82 dmpi->w,dmpi->h,1,vf->priv->direction);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
83 rotate(dmpi->planes[1],mpi->planes[1],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
84 dmpi->stride[1],mpi->stride[1],
6539
79b536a37e40 better planar support, chroma subsampling support and Y8/Y800 support
alex
parents: 5696
diff changeset
85 dmpi->w>>mpi->chroma_x_shift,dmpi->h>>mpi->chroma_y_shift,1,vf->priv->direction);
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
86 rotate(dmpi->planes[2],mpi->planes[2],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
87 dmpi->stride[2],mpi->stride[2],
6539
79b536a37e40 better planar support, chroma subsampling support and Y8/Y800 support
alex
parents: 5696
diff changeset
88 dmpi->w>>mpi->chroma_x_shift,dmpi->h>>mpi->chroma_y_shift,1,vf->priv->direction);
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
89 } else {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
90 rotate(dmpi->planes[0],mpi->planes[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
91 dmpi->stride[0],mpi->stride[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
92 dmpi->w,dmpi->h,dmpi->bpp>>3,vf->priv->direction);
9279
12741a866acd fixed palette support
arpi
parents: 8749
diff changeset
93 dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
94 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
95
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
96 return vf_next_put_image(vf,dmpi, pts);
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
97 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
98
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
99 //===========================================================================//
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
100
8749
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
101 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
102 if(IMGFMT_IS_RGB(fmt) || IMGFMT_IS_BGR(fmt)) return vf_next_query_format(vf, fmt);
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
103 // we can support only symmetric (chroma_x_shift==chroma_y_shift) YUV formats:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
104 switch(fmt) {
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
105 case IMGFMT_YV12:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
106 case IMGFMT_I420:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
107 case IMGFMT_IYUV:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
108 case IMGFMT_YVU9:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
109 // case IMGFMT_IF09:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
110 case IMGFMT_Y8:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
111 case IMGFMT_Y800:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
112 case IMGFMT_444P:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
113 return vf_next_query_format(vf, fmt);
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
114 }
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
115 return 0;
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
116 }
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
117
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
118 static int open(vf_instance_t *vf, char* args){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
119 vf->config=config;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
120 vf->put_image=put_image;
8749
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
121 vf->query_format=query_format;
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
122 vf->priv=malloc(sizeof(struct vf_priv_s));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
123 vf->priv->direction=args?atoi(args):0;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
124 return 1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
125 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
126
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
127 vf_info_t vf_info_rotate = {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
128 "rotate",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
129 "rotate",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
130 "A'rpi",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
131 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
132 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
133 NULL
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
134 };
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
135
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
136 //===========================================================================//