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