Mercurial > mplayer.hg
annotate libmpcodecs/mp_image.h @ 28041:211c23dac000
Treat audio output objects the same as everything else in the build system,
i.e. have lines that conditionally enable each in the Makefile and
corresponding variables set from configure.
author | diego |
---|---|
date | Wed, 03 Dec 2008 12:05:47 +0000 |
parents | 41652035483c |
children | 134689b7b548 |
rev | line source |
---|---|
26029 | 1 #ifndef MPLAYER_MP_IMAGE_H |
2 #define MPLAYER_MP_IMAGE_H | |
4185 | 3 |
26147
41652035483c
Add necessary header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
4 #include <stdio.h> |
41652035483c
Add necessary header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
5 #include <stdlib.h> |
41652035483c
Add necessary header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
6 #include <string.h> |
41652035483c
Add necessary header #includes to fix 'make checkheaders'.
diego
parents:
26029
diff
changeset
|
7 |
6875 | 8 //--------- codec's requirements (filled by the codec/vf) --------- |
9 | |
10 //--- buffer content restrictions: | |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
11 // set if buffer content shouldn't be modified: |
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
12 #define MP_IMGFLAG_PRESERVE 0x01 |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
13 // set if buffer content will be READ for next frame's MC: (I/P mpeg frames) |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
14 #define MP_IMGFLAG_READABLE 0x02 |
6875 | 15 |
16 //--- buffer width/stride/plane restrictions: (used for direct rendering) | |
17 // stride _have_to_ be aligned to MB boundary: [for DR restrictions] | |
18 #define MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE 0x4 | |
19 // stride should be aligned to MB boundary: [for buffer allocation] | |
20 #define MP_IMGFLAG_PREFER_ALIGNED_STRIDE 0x8 | |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
21 // codec accept any stride (>=width): |
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
22 #define MP_IMGFLAG_ACCEPT_STRIDE 0x10 |
6875 | 23 // codec accept any width (width*bpp=stride -> stride%bpp==0) (>=width): |
4962 | 24 #define MP_IMGFLAG_ACCEPT_WIDTH 0x20 |
6875 | 25 //--- for planar formats only: |
26 // uses only stride[0], and stride[1]=stride[2]=stride[0]>>mpi->chroma_x_shift | |
27 #define MP_IMGFLAG_COMMON_STRIDE 0x40 | |
28 // uses only planes[0], and calculates planes[1,2] from width,height,imgfmt | |
29 #define MP_IMGFLAG_COMMON_PLANE 0x80 | |
4185 | 30 |
6875 | 31 #define MP_IMGFLAGMASK_RESTRICTIONS 0xFF |
32 | |
33 //--------- color info (filled by mp_image_setfmt() ) ----------- | |
4185 | 34 // set if number of planes > 1 |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
35 #define MP_IMGFLAG_PLANAR 0x100 |
4185 | 36 // set if it's YUV colorspace |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
37 #define MP_IMGFLAG_YUV 0x200 |
6875 | 38 // set if it's swapped (BGR or YVU) plane/byteorder |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
39 #define MP_IMGFLAG_SWAPPED 0x400 |
6478 | 40 // using palette for RGB data |
6875 | 41 #define MP_IMGFLAG_RGB_PALETTE 0x800 |
42 | |
43 #define MP_IMGFLAGMASK_COLORS 0xF00 | |
44 | |
45 // codec uses drawing/rendering callbacks (draw_slice()-like thing, DR method 2) | |
46 // [the codec will set this flag if it supports callbacks, and the vo _may_ | |
47 // clear it in get_image() if draw_slice() not implemented] | |
48 #define MP_IMGFLAG_DRAW_CALLBACK 0x1000 | |
49 // set if it's in video buffer/memory: [set by vo/vf's get_image() !!!] | |
50 #define MP_IMGFLAG_DIRECT 0x2000 | |
51 // set if buffer is allocated (used in destination images): | |
52 #define MP_IMGFLAG_ALLOCATED 0x4000 | |
53 | |
54 // buffer type was printed (do NOT set this flag - it's for INTERNAL USE!!!) | |
55 #define MP_IMGFLAG_TYPE_DISPLAYED 0x8000 | |
4185 | 56 |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
57 // codec doesn't support any form of direct rendering - it has own buffer |
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
58 // allocation. so we just export its buffer pointers: |
4186 | 59 #define MP_IMGTYPE_EXPORT 0 |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
60 // codec requires a static WO buffer, but it does only partial updates later: |
4186 | 61 #define MP_IMGTYPE_STATIC 1 |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
62 // codec just needs some WO memory, where it writes/copies the whole frame to: |
4186 | 63 #define MP_IMGTYPE_TEMP 2 |
4877
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
64 // I+P type, requires 2+ independent static R/W buffers |
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
65 #define MP_IMGTYPE_IP 3 |
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
66 // I+P+B type, requires 2+ independent static R/W and 1+ temp WO buffers |
9d97874d8691
new flags added for direct rendering (libmpcodecs core)
arpi
parents:
4187
diff
changeset
|
67 #define MP_IMGTYPE_IPB 4 |
4186 | 68 |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
69 #define MP_MAX_PLANES 4 |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
70 |
10663 | 71 #define MP_IMGFIELD_ORDERED 0x01 |
72 #define MP_IMGFIELD_TOP_FIRST 0x02 | |
73 #define MP_IMGFIELD_REPEAT_FIRST 0x04 | |
74 #define MP_IMGFIELD_TOP 0x08 | |
75 #define MP_IMGFIELD_BOTTOM 0x10 | |
11669
bcf9862f61b2
set top_field first for lavc decoding and add MP_IMGFIELD_INTERLACED
michael
parents:
11386
diff
changeset
|
76 #define MP_IMGFIELD_INTERLACED 0x20 |
10510
73b3e4336cd4
Add mpeg2_flags to mp_image_t, copy flags in vd_libmpeg2.c,
ranma
parents:
10316
diff
changeset
|
77 |
4185 | 78 typedef struct mp_image_s { |
79 unsigned short flags; | |
4186 | 80 unsigned char type; |
81 unsigned char bpp; // bits/pixel. NOT depth! for RGB it will be n*8 | |
4185 | 82 unsigned int imgfmt; |
83 int width,height; // stored dimensions | |
84 int x,y,w,h; // visible dimensions | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
85 unsigned char* planes[MP_MAX_PLANES]; |
14792
6c12ee26fab9
stride must be signed! otherwise negative stride is broken on 64bit systems
rfelker
parents:
11669
diff
changeset
|
86 int stride[MP_MAX_PLANES]; |
7984
a57c1fc0c2fc
change qscale type to int8 and fix qscale ordering
michael
parents:
7957
diff
changeset
|
87 char * qscale; |
4185 | 88 int qstride; |
7957
31fd09cc9ba2
passing picture_type (might be usefull for postprocessing)
michael
parents:
6911
diff
changeset
|
89 int pict_type; // 0->unknown, 1->I, 2->P, 3->B |
10663 | 90 int fields; |
9925
420640a0f6d0
passing qscale_type around so the pp code can fix the mpeg2 <<1 thing
michael
parents:
9171
diff
changeset
|
91 int qscale_type; // 0->mpeg1/4/h263, 1->mpeg2 |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
92 int num_planes; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
93 /* these are only used by planar formats Y,U(Cb),V(Cr) */ |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
94 int chroma_width; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
95 int chroma_height; |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
96 int chroma_x_shift; // horizontal |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
97 int chroma_y_shift; // vertical |
6759
415be01747ae
added 'priv' field to mpi - requires for tracking frames with different
arpi
parents:
6707
diff
changeset
|
98 /* for private use by filter or vo driver (to store buffer id or dmpi) */ |
415be01747ae
added 'priv' field to mpi - requires for tracking frames with different
arpi
parents:
6707
diff
changeset
|
99 void* priv; |
4185 | 100 } mp_image_t; |
101 | |
102 #ifdef IMGFMT_YUY2 | |
103 static inline void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){ | |
104 mpi->flags&=~(MP_IMGFLAG_PLANAR|MP_IMGFLAG_YUV|MP_IMGFLAG_SWAPPED); | |
4187 | 105 mpi->imgfmt=out_fmt; |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
106 if(out_fmt == IMGFMT_MPEGPES){ |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
107 mpi->bpp=0; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
108 return; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
109 } |
11386
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
10742
diff
changeset
|
110 if(out_fmt == IMGFMT_ZRMJPEGNI || |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
10742
diff
changeset
|
111 out_fmt == IMGFMT_ZRMJPEGIT || |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
10742
diff
changeset
|
112 out_fmt == IMGFMT_ZRMJPEGIB){ |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
10742
diff
changeset
|
113 mpi->bpp=0; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
10742
diff
changeset
|
114 return; |
229079491864
addition of special image formats for Zoran MJPEG, and vd_zrmjpeg.c
rik
parents:
10742
diff
changeset
|
115 } |
10316 | 116 if(IMGFMT_IS_XVMC(out_fmt)){ |
117 mpi->bpp=0; | |
118 return; | |
119 } | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
120 mpi->num_planes=1; |
6707 | 121 if (IMGFMT_IS_RGB(out_fmt)) { |
9171 | 122 if (IMGFMT_RGB_DEPTH(out_fmt) < 8 && !(out_fmt&128)) |
6707 | 123 mpi->bpp = IMGFMT_RGB_DEPTH(out_fmt); |
124 else | |
125 mpi->bpp=(IMGFMT_RGB_DEPTH(out_fmt)+7)&(~7); | |
4185 | 126 return; |
127 } | |
6707 | 128 if (IMGFMT_IS_BGR(out_fmt)) { |
9171 | 129 if (IMGFMT_BGR_DEPTH(out_fmt) < 8 && !(out_fmt&128)) |
6707 | 130 mpi->bpp = IMGFMT_BGR_DEPTH(out_fmt); |
131 else | |
132 mpi->bpp=(IMGFMT_BGR_DEPTH(out_fmt)+7)&(~7); | |
4185 | 133 mpi->flags|=MP_IMGFLAG_SWAPPED; |
134 return; | |
135 } | |
136 mpi->flags|=MP_IMGFLAG_YUV; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
137 mpi->num_planes=3; |
4185 | 138 switch(out_fmt){ |
139 case IMGFMT_I420: | |
140 case IMGFMT_IYUV: | |
141 mpi->flags|=MP_IMGFLAG_SWAPPED; | |
142 case IMGFMT_YV12: | |
143 mpi->flags|=MP_IMGFLAG_PLANAR; | |
144 mpi->bpp=12; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
145 mpi->chroma_width=(mpi->width>>1); |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
146 mpi->chroma_height=(mpi->height>>1); |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
147 mpi->chroma_x_shift=1; |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
148 mpi->chroma_y_shift=1; |
4185 | 149 return; |
6525 | 150 case IMGFMT_IF09: |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
151 mpi->num_planes=4; |
6478 | 152 case IMGFMT_YVU9: |
153 mpi->flags|=MP_IMGFLAG_PLANAR; | |
154 mpi->bpp=9; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
155 mpi->chroma_width=(mpi->width>>2); |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
156 mpi->chroma_height=(mpi->height>>2); |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
157 mpi->chroma_x_shift=2; |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
158 mpi->chroma_y_shift=2; |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
159 return; |
6863 | 160 case IMGFMT_444P: |
161 mpi->flags|=MP_IMGFLAG_PLANAR; | |
162 mpi->bpp=24; | |
163 mpi->chroma_width=(mpi->width); | |
164 mpi->chroma_height=(mpi->height); | |
165 mpi->chroma_x_shift=0; | |
166 mpi->chroma_y_shift=0; | |
167 return; | |
168 case IMGFMT_422P: | |
169 mpi->flags|=MP_IMGFLAG_PLANAR; | |
170 mpi->bpp=16; | |
171 mpi->chroma_width=(mpi->width>>1); | |
172 mpi->chroma_height=(mpi->height); | |
173 mpi->chroma_x_shift=1; | |
174 mpi->chroma_y_shift=0; | |
175 return; | |
176 case IMGFMT_411P: | |
177 mpi->flags|=MP_IMGFLAG_PLANAR; | |
178 mpi->bpp=12; | |
179 mpi->chroma_width=(mpi->width>>2); | |
180 mpi->chroma_height=(mpi->height); | |
181 mpi->chroma_x_shift=2; | |
182 mpi->chroma_y_shift=0; | |
183 return; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
184 case IMGFMT_Y800: |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
185 case IMGFMT_Y8: |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
186 /* they're planar ones, but for easier handling use them as packed */ |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
187 // mpi->flags|=MP_IMGFLAG_PLANAR; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
188 mpi->bpp=8; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
189 mpi->num_planes=1; |
6478 | 190 return; |
4185 | 191 case IMGFMT_UYVY: |
192 mpi->flags|=MP_IMGFLAG_SWAPPED; | |
193 case IMGFMT_YUY2: | |
194 mpi->bpp=16; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
195 mpi->num_planes=1; |
5144 | 196 return; |
10742
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
197 case IMGFMT_NV12: |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
198 mpi->flags|=MP_IMGFLAG_SWAPPED; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
199 case IMGFMT_NV21: |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
200 mpi->flags|=MP_IMGFLAG_PLANAR; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
201 mpi->bpp=12; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
202 mpi->num_planes=2; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
203 mpi->chroma_width=(mpi->width>>0); |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
204 mpi->chroma_height=(mpi->height>>1); |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
205 mpi->chroma_x_shift=0; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
206 mpi->chroma_y_shift=1; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
207 return; |
4185 | 208 } |
17971 | 209 fprintf(stderr,"mp_image: unknown out_fmt: 0x%X\n",out_fmt); |
4185 | 210 mpi->bpp=0; |
211 } | |
212 #endif | |
213 | |
214 static inline mp_image_t* new_mp_image(int w,int h){ | |
6911 | 215 mp_image_t* mpi=(mp_image_t*)malloc(sizeof(mp_image_t)); |
4185 | 216 if(!mpi) return NULL; // error! |
217 memset(mpi,0,sizeof(mp_image_t)); | |
218 mpi->width=mpi->w=w; | |
219 mpi->height=mpi->h=h; | |
220 return mpi; | |
221 } | |
4933 | 222 |
5737 | 223 static inline void free_mp_image(mp_image_t* mpi){ |
224 if(!mpi) return; | |
225 if(mpi->flags&MP_IMGFLAG_ALLOCATED){ | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
226 /* becouse we allocate the whole image in once */ |
5737 | 227 if(mpi->planes[0]) free(mpi->planes[0]); |
228 } | |
229 free(mpi); | |
230 } | |
231 | |
23994
8572d2ef5263
Move alloc_mpi and copy_mpi from libmenu/vf_menu.c to libmpcodecs/mp_image.c.
cehoyos
parents:
23689
diff
changeset
|
232 mp_image_t* alloc_mpi(int w, int h, unsigned long int fmt); |
8572d2ef5263
Move alloc_mpi and copy_mpi from libmenu/vf_menu.c to libmpcodecs/mp_image.c.
cehoyos
parents:
23689
diff
changeset
|
233 void copy_mpi(mp_image_t *dmpi, mp_image_t *mpi); |
8572d2ef5263
Move alloc_mpi and copy_mpi from libmenu/vf_menu.c to libmpcodecs/mp_image.c.
cehoyos
parents:
23689
diff
changeset
|
234 |
26029 | 235 #endif /* MPLAYER_MP_IMAGE_H */ |