Mercurial > mplayer.hg
annotate libmpcodecs/mp_image.h @ 21542:0c19aa6f8e4e
Fix misplaced http_free
| author | reimar |
|---|---|
| date | Sat, 09 Dec 2006 19:50:08 +0000 |
| parents | fd0d4b94b5ec |
| children | 3f0d00abc073 |
| 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 } |
| 17971 | 205 fprintf(stderr,"mp_image: unknown out_fmt: 0x%X\n",out_fmt); |
| 4185 | 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 |
