Mercurial > mplayer.hg
annotate libmpcodecs/mp_image.h @ 30368:9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
author | reimar |
---|---|
date | Sat, 23 Jan 2010 23:50:25 +0000 |
parents | ad61464d02a7 |
children | bbb6ebec87a0 |
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 |
30074 | 41 // set if you want memory for palette allocated and managed by vf_get_image etc. |
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; |
30096
76c25bfa181b
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
reimar
parents:
30074
diff
changeset
|
136 if (mp_get_chroma_shift(out_fmt, NULL, NULL)) { |
76c25bfa181b
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
reimar
parents:
30074
diff
changeset
|
137 mpi->flags|=MP_IMGFLAG_PLANAR; |
76c25bfa181b
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
reimar
parents:
30074
diff
changeset
|
138 mpi->bpp = mp_get_chroma_shift(out_fmt, &mpi->chroma_x_shift, &mpi->chroma_y_shift); |
76c25bfa181b
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
reimar
parents:
30074
diff
changeset
|
139 mpi->chroma_width = mpi->width >> mpi->chroma_x_shift; |
76c25bfa181b
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
reimar
parents:
30074
diff
changeset
|
140 mpi->chroma_height = mpi->height >> mpi->chroma_y_shift; |
76c25bfa181b
Add a helper function to get the chroma scale shift and use to simplify mpi setup.
reimar
parents:
30074
diff
changeset
|
141 } |
4185 | 142 switch(out_fmt){ |
143 case IMGFMT_I420: | |
144 case IMGFMT_IYUV: | |
145 mpi->flags|=MP_IMGFLAG_SWAPPED; | |
146 case IMGFMT_YV12: | |
147 return; | |
30115
ad61464d02a7
Add support for YUV format with alpha and fix the codecs.conf entry for vp6a
reimar
parents:
30110
diff
changeset
|
148 case IMGFMT_420A: |
6525 | 149 case IMGFMT_IF09: |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
150 mpi->num_planes=4; |
6478 | 151 case IMGFMT_YVU9: |
6863 | 152 case IMGFMT_444P: |
153 case IMGFMT_422P: | |
154 case IMGFMT_411P: | |
30098 | 155 case IMGFMT_440P: |
30110 | 156 case IMGFMT_444P16_LE: |
157 case IMGFMT_444P16_BE: | |
158 case IMGFMT_422P16_LE: | |
159 case IMGFMT_422P16_BE: | |
160 case IMGFMT_420P16_LE: | |
161 case IMGFMT_420P16_BE: | |
6863 | 162 return; |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
163 case IMGFMT_Y800: |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
164 case IMGFMT_Y8: |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
165 /* 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
|
166 // mpi->flags|=MP_IMGFLAG_PLANAR; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
167 mpi->bpp=8; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
168 mpi->num_planes=1; |
6478 | 169 return; |
4185 | 170 case IMGFMT_UYVY: |
171 mpi->flags|=MP_IMGFLAG_SWAPPED; | |
172 case IMGFMT_YUY2: | |
173 mpi->bpp=16; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
174 mpi->num_planes=1; |
5144 | 175 return; |
10742
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
176 case IMGFMT_NV12: |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
177 mpi->flags|=MP_IMGFLAG_SWAPPED; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
178 case IMGFMT_NV21: |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
179 mpi->flags|=MP_IMGFLAG_PLANAR; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
180 mpi->bpp=12; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
181 mpi->num_planes=2; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
182 mpi->chroma_width=(mpi->width>>0); |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
183 mpi->chroma_height=(mpi->height>>1); |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
184 mpi->chroma_x_shift=0; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
185 mpi->chroma_y_shift=1; |
794b55a44528
basic nv12 and nv21 support by Angelo Cano <angelo_cano@fastmail.fm>
alex
parents:
10663
diff
changeset
|
186 return; |
4185 | 187 } |
28518 | 188 mp_msg(MSGT_DECVIDEO,MSGL_WARN,"mp_image: unknown out_fmt: 0x%X\n",out_fmt); |
4185 | 189 mpi->bpp=0; |
190 } | |
191 #endif | |
192 | |
193 static inline mp_image_t* new_mp_image(int w,int h){ | |
6911 | 194 mp_image_t* mpi=(mp_image_t*)malloc(sizeof(mp_image_t)); |
4185 | 195 if(!mpi) return NULL; // error! |
196 memset(mpi,0,sizeof(mp_image_t)); | |
197 mpi->width=mpi->w=w; | |
198 mpi->height=mpi->h=h; | |
199 return mpi; | |
200 } | |
4933 | 201 |
5737 | 202 static inline void free_mp_image(mp_image_t* mpi){ |
203 if(!mpi) return; | |
204 if(mpi->flags&MP_IMGFLAG_ALLOCATED){ | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
205 /* becouse we allocate the whole image in once */ |
5737 | 206 if(mpi->planes[0]) free(mpi->planes[0]); |
30074 | 207 if (mpi->flags & MP_IMGFLAG_RGB_PALETTE) |
208 free(mpi->planes[1]); | |
5737 | 209 } |
210 free(mpi); | |
211 } | |
212 | |
23994
8572d2ef5263
Move alloc_mpi and copy_mpi from libmenu/vf_menu.c to libmpcodecs/mp_image.c.
cehoyos
parents:
23689
diff
changeset
|
213 mp_image_t* alloc_mpi(int w, int h, unsigned long int fmt); |
30115
ad61464d02a7
Add support for YUV format with alpha and fix the codecs.conf entry for vp6a
reimar
parents:
30110
diff
changeset
|
214 void mp_image_alloc_planes(mp_image_t *mpi); |
23994
8572d2ef5263
Move alloc_mpi and copy_mpi from libmenu/vf_menu.c to libmpcodecs/mp_image.c.
cehoyos
parents:
23689
diff
changeset
|
215 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
|
216 |
26029 | 217 #endif /* MPLAYER_MP_IMAGE_H */ |