annotate libmpcodecs/vf_rotate.c @ 13610:b79ee5bf2c9e

Sync with GomGom's patch-12 version. updated copyright bvhq options added (xvid 1.1+ api4.1) psnr handling moved in separate functions proper free() on uninit printf -> mp_msg capability to flush delayed frames Changes by me (iive) support for flushing delayed frames at the end suppressed cosmetics and new aspect code changes
author iive
date Mon, 11 Oct 2004 15:48:18 +0000
parents e9a2af584986
children 6ff3379a0862
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
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
6 #include "../config.h"
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
7 #include "../mp_msg.h"
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 #include "../libvo/fastmemcpy.h"
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
14 #include "../postproc/rgb2rgb.h"
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
15
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
16 struct vf_priv_s {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
17 int direction;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
18 };
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
19
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
20 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
21 int y;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
22 if(dir&1){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
23 src+=srcstride*(w-1);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
24 srcstride*=-1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
25 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
26 if(dir&2){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
27 dst+=dststride*(h-1);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
28 dststride*=-1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
29 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
30
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
31 for(y=0;y<h;y++){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
32 int x;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
33 switch(bpp){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
34 case 1:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
35 for(x=0;x<w;x++) dst[x]=src[y+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
36 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
37 case 2:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
38 for(x=0;x<w;x++) *((short*)(dst+x*2))=*((short*)(src+y*2+x*srcstride));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
39 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
40 case 3:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
41 for(x=0;x<w;x++){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
42 dst[x*3+0]=src[0+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
43 dst[x*3+1]=src[1+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
44 dst[x*3+2]=src[2+y*3+x*srcstride];
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
45 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
46 break;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
47 case 4:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
48 for(x=0;x<w;x++) *((int*)(dst+x*4))=*((int*)(src+y*4+x*srcstride));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
49 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
50 dst+=dststride;
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
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
56 static int config(struct vf_instance_s* vf,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
57 int width, int height, int d_width, int d_height,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
58 unsigned int flags, unsigned int outfmt){
7871
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 if (width<height) vf->priv->direction&=3;
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
61 }
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
62 if (vf->priv->direction & 4){
7b7254cf6553 automatic rotation for mode 4..7, based on
arpi
parents: 7368
diff changeset
63 vf->put_image=vf_next_put_image; // passthru mode!
8367
14af7d96df34 Fix draw_slice() in passthrough mode.
arpi
parents: 7871
diff changeset
64 if (vf->next->draw_slice) vf->draw_slice=vf_next_draw_slice;
14af7d96df34 Fix draw_slice() in passthrough mode.
arpi
parents: 7871
diff changeset
65 /* 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
66 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
67 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
68 }
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
69 return vf_next_config(vf,height,width,d_height,d_width,flags,outfmt);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
70 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
71
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 6539
diff changeset
72 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
73 mp_image_t *dmpi;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
74
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
75 // hope we'll get DR buffer:
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
76 dmpi=vf_get_image(vf->next,mpi->imgfmt,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
77 MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
78 mpi->h, mpi->w);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
79
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
80 if(mpi->flags&MP_IMGFLAG_PLANAR){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
81 rotate(dmpi->planes[0],mpi->planes[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
82 dmpi->stride[0],mpi->stride[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
83 dmpi->w,dmpi->h,1,vf->priv->direction);
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
84 rotate(dmpi->planes[1],mpi->planes[1],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
85 dmpi->stride[1],mpi->stride[1],
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 rotate(dmpi->planes[2],mpi->planes[2],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
88 dmpi->stride[2],mpi->stride[2],
6539
79b536a37e40 better planar support, chroma subsampling support and Y8/Y800 support
alex
parents: 5696
diff changeset
89 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
90 } else {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
91 rotate(dmpi->planes[0],mpi->planes[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
92 dmpi->stride[0],mpi->stride[0],
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
93 dmpi->w,dmpi->h,dmpi->bpp>>3,vf->priv->direction);
9279
12741a866acd fixed palette support
arpi
parents: 8749
diff changeset
94 dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
95 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
96
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 6539
diff changeset
97 return vf_next_put_image(vf,dmpi);
5696
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 //===========================================================================//
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
101
8749
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
102 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
103 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
104 // 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
105 switch(fmt) {
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
106 case IMGFMT_YV12:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
107 case IMGFMT_I420:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
108 case IMGFMT_IYUV:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
109 case IMGFMT_YVU9:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
110 // case IMGFMT_IF09:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
111 case IMGFMT_Y8:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
112 case IMGFMT_Y800:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
113 case IMGFMT_444P:
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
114 return vf_next_query_format(vf, fmt);
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
115 }
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
116 return 0;
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
117 }
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
118
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
119 static int open(vf_instance_t *vf, char* args){
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
120 vf->config=config;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
121 vf->put_image=put_image;
8749
8d29bc9a5836 cannot rotate non-symmetric yuv pixel formats
arpi
parents: 8367
diff changeset
122 vf->query_format=query_format;
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
123 vf->priv=malloc(sizeof(struct vf_priv_s));
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
124 vf->priv->direction=args?atoi(args):0;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
125 return 1;
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
126 }
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
127
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
128 vf_info_t vf_info_rotate = {
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
129 "rotate",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
130 "rotate",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
131 "A'rpi",
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
132 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
133 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9279
diff changeset
134 NULL
5696
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
135 };
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
136
4a042adc5bd1 rotation/mirror filter
arpi
parents:
diff changeset
137 //===========================================================================//