annotate libmpcodecs/vf_mirror.c @ 17135:d2bafb1e217c

Every contribution deserves to be listed on the "about" window of the gui. Change the way this list is done by following the layout of AUTHORS
author gpoirier
date Wed, 07 Dec 2005 21:17:29 +0000
parents 6ff3379a0862
children 20aca9baf5d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
1 #include <stdio.h>
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
2 #include <stdlib.h>
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
3 #include <string.h>
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
4 #include <inttypes.h>
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
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"
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
8
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
9 #include "img_format.h"
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
10 #include "mp_image.h"
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
11 #include "vf.h"
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
12
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9593
diff changeset
13 #include "libvo/fastmemcpy.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 9593
diff changeset
14 #include "postproc/rgb2rgb.h"
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
15
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
16
8748
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
17 static void mirror(unsigned char* dst,unsigned char* src,int dststride,int srcstride,int w,int h,int bpp,unsigned int fmt){
5772
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
18 int y;
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
19 for(y=0;y<h;y++){
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
20 int x;
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
21 switch(bpp){
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
22 case 1:
5772
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
23 for(x=0;x<w;x++) dst[x]=src[w-x-1];
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
24 break;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
25 case 2:
8748
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
26 switch(fmt){
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
27 case IMGFMT_UYVY: {
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
28 // packed YUV is tricky. U,V are 32bpp while Y is 16bpp:
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
29 int w2=w>>1;
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
30 for(x=0;x<w2;x++){
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
31 // TODO: optimize this...
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
32 dst[x*4+0]=src[0+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
33 dst[x*4+1]=src[3+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
34 dst[x*4+2]=src[2+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
35 dst[x*4+3]=src[1+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
36 }
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
37 break; }
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
38 case IMGFMT_YUY2:
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
39 case IMGFMT_YVYU: {
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
40 // packed YUV is tricky. U,V are 32bpp while Y is 16bpp:
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
41 int w2=w>>1;
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
42 for(x=0;x<w2;x++){
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
43 // TODO: optimize this...
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
44 dst[x*4+0]=src[2+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
45 dst[x*4+1]=src[1+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
46 dst[x*4+2]=src[0+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
47 dst[x*4+3]=src[3+(w2-x-1)*4];
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
48 }
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
49 break; }
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
50 default:
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
51 for(x=0;x<w;x++) *((short*)(dst+x*2))=*((short*)(src+(w-x-1)*2));
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
52 }
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
53 break;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
54 case 3:
5772
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
55 for(x=0;x<w;x++){
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
56 dst[x*3+0]=src[0+(w-x-1)*3];
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
57 dst[x*3+1]=src[1+(w-x-1)*3];
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
58 dst[x*3+2]=src[2+(w-x-1)*3];
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
59 }
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
60 break;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
61 case 4:
5772
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
62 for(x=0;x<w;x++) *((int*)(dst+x*4))=*((int*)(src+(w-x-1)*4));
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
63 }
5772
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
64 src+=srcstride;
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
65 dst+=dststride;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
66 }
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
67 }
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
68
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
69 //===========================================================================//
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
70
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 6539
diff changeset
71 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
72 mp_image_t *dmpi;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
73
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
74 // hope we'll get DR buffer:
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
75 dmpi=vf_get_image(vf->next,mpi->imgfmt,
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
76 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
77 mpi->w, mpi->h);
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
78
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
79 if(mpi->flags&MP_IMGFLAG_PLANAR){
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
80 mirror(dmpi->planes[0],mpi->planes[0],
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
81 dmpi->stride[0],mpi->stride[0],
8748
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
82 dmpi->w,dmpi->h,1,mpi->imgfmt);
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
83 mirror(dmpi->planes[1],mpi->planes[1],
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
84 dmpi->stride[1],mpi->stride[1],
8748
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
85 dmpi->w>>mpi->chroma_x_shift,dmpi->h>>mpi->chroma_y_shift,1,mpi->imgfmt);
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
86 mirror(dmpi->planes[2],mpi->planes[2],
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
87 dmpi->stride[2],mpi->stride[2],
8748
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
88 dmpi->w>>mpi->chroma_x_shift,dmpi->h>>mpi->chroma_y_shift,1,mpi->imgfmt);
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
89 } else {
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
90 mirror(dmpi->planes[0],mpi->planes[0],
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
91 dmpi->stride[0],mpi->stride[0],
8748
30f7df2d1bed fixed 16bpp packed YUV formats
arpi
parents: 7368
diff changeset
92 dmpi->w,dmpi->h,dmpi->bpp>>3,mpi->imgfmt);
9279
12741a866acd fixed palette support
arpi
parents: 8748
diff changeset
93 dmpi->planes[1]=mpi->planes[1]; // passthrough rgb8 palette
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
94 }
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
95
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 6539
diff changeset
96 return vf_next_put_image(vf,dmpi);
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
97 }
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
98
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
99 //===========================================================================//
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
100
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
101 static int open(vf_instance_t *vf, char* args){
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
102 //vf->config=config;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
103 vf->put_image=put_image;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
104 return 1;
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
105 }
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
106
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
107 vf_info_t vf_info_mirror = {
5772
cfb787b821a0 10l, >1bpp modes fixed..., x<->y swapped
arpi
parents: 5763
diff changeset
108 "horizontal mirror",
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
109 "mirror",
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
110 "Eyck",
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
111 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
112 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
113 NULL
5763
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
114 };
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
115
e9fb293c53d2 Complement existing filters - rotate and flip.
eyck
parents:
diff changeset
116 //===========================================================================//