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