annotate libmpcodecs/vf_rotate.c @ 26883:a365271c97a5

Revert commit r26897. XviD is the correct spelling of the codec. You can see it written in the codec own documentation and header files. Prefered name capitalization confirmed in conversation with XviD developer (prunedtree).
author iive
date Wed, 28 May 2008 23:04:41 +0000
parents 00fff9a3b735
children 0f1b5b68af32
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
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
13 struct vf_priv_s {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
14 int direction;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
15 };
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
16
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
17 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
18 int y;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
19 if(dir&1){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
20 src+=srcstride*(w-1);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
21 srcstride*=-1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
22 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
23 if(dir&2){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
24 dst+=dststride*(h-1);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
25 dststride*=-1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
26 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
27
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
28 for(y=0;y<h;y++){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
29 int x;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
30 switch(bpp){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
31 case 1:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
32 for(x=0;x<w;x++) dst[x]=src[y+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
33 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
34 case 2:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
35 for(x=0;x<w;x++) *((short*)(dst+x*2))=*((short*)(src+y*2+x*srcstride));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
36 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
37 case 3:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
38 for(x=0;x<w;x++){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
39 dst[x*3+0]=src[0+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
40 dst[x*3+1]=src[1+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
41 dst[x*3+2]=src[2+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
42 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
43 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
44 case 4:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
45 for(x=0;x<w;x++) *((int*)(dst+x*4))=*((int*)(src+y*4+x*srcstride));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
46 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
47 dst+=dststride;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
48 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
49 }
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 static int config(struct vf_instance_s* vf,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
54 int width, int height, int d_width, int d_height,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
55 unsigned int flags, unsigned int outfmt){
7871
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
56 if (vf->priv->direction & 4) {
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
57 if (width<height) vf->priv->direction&=3;
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
58 }
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
59 if (vf->priv->direction & 4){
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
60 vf->put_image=vf_next_put_image; // passthru mode!
8367
14af7d96df34 Fix draw_slice() in passthrough mode.
arpi
parents: 7871
diff changeset
61 if (vf->next->draw_slice) vf->draw_slice=vf_next_draw_slice;
14af7d96df34 Fix draw_slice() in passthrough mode.
arpi
parents: 7871
diff changeset
62 /* 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
63 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
64 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
65 }
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
66 return vf_next_config(vf,height,width,d_height,d_width,flags,outfmt);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
67 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
68
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
69 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
70 mp_image_t *dmpi;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
71
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
72 // hope we'll get DR buffer:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
73 dmpi=vf_get_image(vf->next,mpi->imgfmt,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
74 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
75 mpi->h, mpi->w);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
76
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
77 if(mpi->flags&MP_IMGFLAG_PLANAR){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
78 rotate(dmpi->planes[0],mpi->planes[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
79 dmpi->stride[0],mpi->stride[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
80 dmpi->w,dmpi->h,1,vf->priv->direction);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
81 rotate(dmpi->planes[1],mpi->planes[1],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
82 dmpi->stride[1],mpi->stride[1],
6539
79b536a37e40 better planar support, chroma subsampling support and Y8/Y800 support
alex
parents: 5696
diff changeset
83 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
84 rotate(dmpi->planes[2],mpi->planes[2],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
85 dmpi->stride[2],mpi->stride[2],
6539
79b536a37e40 better planar support, chroma subsampling support and Y8/Y800 support
alex
parents: 5696
diff changeset
86 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
87 } else {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
88 rotate(dmpi->planes[0],mpi->planes[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
89 dmpi->stride[0],mpi->stride[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
90 dmpi->w,dmpi->h,dmpi->bpp>>3,vf->priv->direction);
9279
12741a866acd fixed palette support
arpi
parents: 8749
diff changeset
91 dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
92 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
93
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17012
diff changeset
94 return vf_next_put_image(vf,dmpi, pts);
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
95 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
96
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
97 //===========================================================================//
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
98
8749
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
99 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
100 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
101 // 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
102 switch(fmt) {
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
103 case IMGFMT_YV12:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
104 case IMGFMT_I420:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
105 case IMGFMT_IYUV:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
106 case IMGFMT_YVU9:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
107 // case IMGFMT_IF09:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
108 case IMGFMT_Y8:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
109 case IMGFMT_Y800:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
110 case IMGFMT_444P:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
111 return vf_next_query_format(vf, fmt);
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
112 }
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
113 return 0;
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
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
116 static int open(vf_instance_t *vf, char* args){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
117 vf->config=config;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
118 vf->put_image=put_image;
8749
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
119 vf->query_format=query_format;
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
120 vf->priv=malloc(sizeof(struct vf_priv_s));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
121 vf->priv->direction=args?atoi(args):0;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
122 return 1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
123 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
124
25221
00fff9a3b735 Make all vf_info_t structs const
reimar
parents: 23373
diff changeset
125 const vf_info_t vf_info_rotate = {
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
126 "rotate",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
127 "rotate",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
128 "A'rpi",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
129 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
130 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
131 NULL
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
132 };
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
133
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
134 //===========================================================================//