Mercurial > mplayer.hg
annotate libmpcodecs/mp_image.h @ 8598:824481376632
"MPlayer does the right thing, presents frame 9 for 1.1 seconds, and continues
with frame 20. MEncoder calculates the right "frame_time", but duplicates the
frame following the gap, i.e. frame 20 is presented for 1.1 seconds."
patch by Jan Kritzner <kritzner@i4.informatik.rwth-aachen.de>
author | arpi |
---|---|
date | Sat, 28 Dec 2002 12:51:05 +0000 |
parents | a57c1fc0c2fc |
children | 898e5270a46e |
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 |
4185 | 67 typedef struct mp_image_s { |
68 unsigned short flags; | |
4186 | 69 unsigned char type; |
70 unsigned char bpp; // bits/pixel. NOT depth! for RGB it will be n*8 | |
4185 | 71 unsigned int imgfmt; |
72 int width,height; // stored dimensions | |
73 int x,y,w,h; // visible dimensions | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
74 unsigned char* planes[MP_MAX_PLANES]; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
75 unsigned int stride[MP_MAX_PLANES]; |
7984
a57c1fc0c2fc
change qscale type to int8 and fix qscale ordering
michael
parents:
7957
diff
changeset
|
76 char * qscale; |
4185 | 77 int qstride; |
7957
31fd09cc9ba2
passing picture_type (might be usefull for postprocessing)
michael
parents:
6911
diff
changeset
|
78 int pict_type; // 0->unknown, 1->I, 2->P, 3->B |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
79 int num_planes; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
80 /* 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
|
81 int chroma_width; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
82 int chroma_height; |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
83 int chroma_x_shift; // horizontal |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
84 int chroma_y_shift; // vertical |
6759
415be01747ae
added 'priv' field to mpi - requires for tracking frames with different
arpi
parents:
6707
diff
changeset
|
85 /* 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
|
86 void* priv; |
4185 | 87 } mp_image_t; |
88 | |
89 #ifdef IMGFMT_YUY2 | |
90 static inline void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){ | |
91 mpi->flags&=~(MP_IMGFLAG_PLANAR|MP_IMGFLAG_YUV|MP_IMGFLAG_SWAPPED); | |
4187 | 92 mpi->imgfmt=out_fmt; |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
93 if(out_fmt == IMGFMT_MPEGPES){ |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
94 mpi->bpp=0; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
95 return; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
96 } |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
97 mpi->num_planes=1; |
6707 | 98 if (IMGFMT_IS_RGB(out_fmt)) { |
99 if (IMGFMT_RGB_DEPTH(out_fmt) < 8) | |
100 mpi->bpp = IMGFMT_RGB_DEPTH(out_fmt); | |
101 else | |
102 mpi->bpp=(IMGFMT_RGB_DEPTH(out_fmt)+7)&(~7); | |
4185 | 103 return; |
104 } | |
6707 | 105 if (IMGFMT_IS_BGR(out_fmt)) { |
106 if (IMGFMT_BGR_DEPTH(out_fmt) < 8) | |
107 mpi->bpp = IMGFMT_BGR_DEPTH(out_fmt); | |
108 else | |
109 mpi->bpp=(IMGFMT_BGR_DEPTH(out_fmt)+7)&(~7); | |
4185 | 110 mpi->flags|=MP_IMGFLAG_SWAPPED; |
111 return; | |
112 } | |
113 mpi->flags|=MP_IMGFLAG_YUV; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
114 mpi->num_planes=3; |
4185 | 115 switch(out_fmt){ |
116 case IMGFMT_I420: | |
117 case IMGFMT_IYUV: | |
118 mpi->flags|=MP_IMGFLAG_SWAPPED; | |
119 case IMGFMT_YV12: | |
120 mpi->flags|=MP_IMGFLAG_PLANAR; | |
121 mpi->bpp=12; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
122 mpi->chroma_width=(mpi->width>>1); |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
123 mpi->chroma_height=(mpi->height>>1); |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
124 mpi->chroma_x_shift=1; |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
125 mpi->chroma_y_shift=1; |
4185 | 126 return; |
6525 | 127 case IMGFMT_IF09: |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
128 mpi->num_planes=4; |
6478 | 129 case IMGFMT_YVU9: |
130 mpi->flags|=MP_IMGFLAG_PLANAR; | |
131 mpi->bpp=9; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
132 mpi->chroma_width=(mpi->width>>2); |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
133 mpi->chroma_height=(mpi->height>>2); |
6539
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
134 mpi->chroma_x_shift=2; |
79b536a37e40
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6538
diff
changeset
|
135 mpi->chroma_y_shift=2; |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
136 return; |
6863 | 137 case IMGFMT_444P: |
138 mpi->flags|=MP_IMGFLAG_PLANAR; | |
139 mpi->bpp=24; | |
140 mpi->chroma_width=(mpi->width); | |
141 mpi->chroma_height=(mpi->height); | |
142 mpi->chroma_x_shift=0; | |
143 mpi->chroma_y_shift=0; | |
144 return; | |
145 case IMGFMT_422P: | |
146 mpi->flags|=MP_IMGFLAG_PLANAR; | |
147 mpi->bpp=16; | |
148 mpi->chroma_width=(mpi->width>>1); | |
149 mpi->chroma_height=(mpi->height); | |
150 mpi->chroma_x_shift=1; | |
151 mpi->chroma_y_shift=0; | |
152 return; | |
153 case IMGFMT_411P: | |
154 mpi->flags|=MP_IMGFLAG_PLANAR; | |
155 mpi->bpp=12; | |
156 mpi->chroma_width=(mpi->width>>2); | |
157 mpi->chroma_height=(mpi->height); | |
158 mpi->chroma_x_shift=2; | |
159 mpi->chroma_y_shift=0; | |
160 return; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
161 case IMGFMT_Y800: |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
162 case IMGFMT_Y8: |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
163 /* 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
|
164 // mpi->flags|=MP_IMGFLAG_PLANAR; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
165 mpi->bpp=8; |
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
166 mpi->num_planes=1; |
6478 | 167 return; |
4185 | 168 case IMGFMT_UYVY: |
169 mpi->flags|=MP_IMGFLAG_SWAPPED; | |
170 case IMGFMT_YUY2: | |
171 mpi->bpp=16; | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
172 mpi->num_planes=1; |
5144 | 173 return; |
4185 | 174 } |
175 printf("mp_image: Unknown out_fmt: 0x%X\n",out_fmt); | |
176 mpi->bpp=0; | |
177 } | |
178 #endif | |
179 | |
180 static inline mp_image_t* new_mp_image(int w,int h){ | |
6911 | 181 mp_image_t* mpi=(mp_image_t*)malloc(sizeof(mp_image_t)); |
4185 | 182 if(!mpi) return NULL; // error! |
183 memset(mpi,0,sizeof(mp_image_t)); | |
184 mpi->width=mpi->w=w; | |
185 mpi->height=mpi->h=h; | |
186 return mpi; | |
187 } | |
4933 | 188 |
5737 | 189 static inline void free_mp_image(mp_image_t* mpi){ |
190 if(!mpi) return; | |
191 if(mpi->flags&MP_IMGFLAG_ALLOCATED){ | |
6538
afb4f3c107e7
better planar support, chroma subsampling support and Y8/Y800 support
alex
parents:
6525
diff
changeset
|
192 /* becouse we allocate the whole image in once */ |
5737 | 193 if(mpi->planes[0]) free(mpi->planes[0]); |
194 } | |
195 free(mpi); | |
196 } | |
197 | |
4933 | 198 #endif |