Mercurial > mplayer.hg
annotate libmpcodecs/vd_mpng.c @ 27985:1c77b86d355d
Remove a ColorFill that is not necessary since the surface it is used
on has exactly the same size as the video image and the video will
be copied into it before it is used the first time.
author | reimar |
---|---|
date | Mon, 24 Nov 2008 09:46:23 +0000 |
parents | a124f3abc1ec |
children | 0f1b5b68af32 |
rev | line source |
---|---|
4998 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 | |
4 #include "config.h" | |
5 #include "mp_msg.h" | |
6 | |
7 #include <png.h> | |
8 | |
21372 | 9 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21372
diff
changeset
|
10 #include "mpbswap.h" |
4998 | 11 #include "libvo/fastmemcpy.h" |
12 | |
13 #include "vd_internal.h" | |
14 | |
15 static vd_info_t info = { | |
16 "PNG Images decoder", | |
17 "mpng", | |
18 "A'rpi", | |
19 ".so, based on mpng.c", | |
20 "uses libpng, 8bpp modes not supported yet" | |
21 }; | |
22 | |
23 LIBVD_EXTERN(mpng) | |
24 | |
25 static unsigned int out_fmt=0; | |
26 | |
27 static int last_w=-1; | |
28 static int last_h=-1; | |
29 static int last_c=-1; | |
30 | |
31 // to set/get/query special features/parameters | |
32 static int control(sh_video_t *sh,int cmd,void* arg,...){ | |
11566
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
33 switch (cmd) |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
34 { |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
35 case VDCTRL_QUERY_FORMAT: |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
36 if (*((int *) arg) == out_fmt) return CONTROL_TRUE; |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
37 return CONTROL_FALSE; |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
38 } |
4998 | 39 return CONTROL_UNKNOWN; |
40 } | |
41 | |
42 // init driver | |
43 static int init(sh_video_t *sh){ | |
44 last_w=-1; | |
45 return 1; | |
46 } | |
47 | |
48 // uninit driver | |
49 static void uninit(sh_video_t *sh){ | |
50 } | |
51 | |
52 //mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h); | |
53 | |
54 static int pngPointer; | |
55 static int pngLength; | |
56 | |
57 static void pngReadFN( png_structp pngstr,png_bytep buffer,png_size_t size ) | |
58 { | |
59 char * p = pngstr->io_ptr; | |
60 if(size>pngLength-pngPointer && pngLength>=pngPointer) size=pngLength-pngPointer; | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
21507
diff
changeset
|
61 fast_memcpy( buffer,(char *)&p[pngPointer],size ); |
4998 | 62 pngPointer+=size; |
63 } | |
64 | |
65 // decode a frame | |
66 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ | |
67 png_structp png; | |
68 png_infop info; | |
69 png_infop endinfo; | |
70 // png_bytep data; | |
71 png_bytep * row_p; | |
72 png_uint_32 png_width=0,png_height=0; | |
73 int depth,color; | |
74 png_uint_32 i; | |
75 mp_image_t* mpi; | |
76 | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
77 int cols; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
78 png_colorp pal; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
79 unsigned char *p; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
80 |
4998 | 81 if(len<=0) return NULL; // skipped frame |
82 | |
83 png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL ); | |
84 info=png_create_info_struct( png ); | |
85 endinfo=png_create_info_struct( png ); | |
86 | |
87 pngPointer=8; | |
88 pngLength=len; | |
89 png_set_read_fn( png,data,pngReadFN ); | |
17552
3469899beb42
Fix mpng to work correctly with 16 bit png's. don't have any files to test
ods15
parents:
15502
diff
changeset
|
90 png_set_strip_16( png ); |
4998 | 91 png_set_sig_bytes( png,8 ); |
92 png_read_info( png,info ); | |
93 png_get_IHDR( png,info,&png_width,&png_height,&depth,&color,NULL,NULL,NULL ); | |
94 png_set_bgr( png ); | |
95 | |
96 switch( info->color_type ) { | |
97 case PNG_COLOR_TYPE_GRAY_ALPHA: | |
98 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry gray scaled png with alpha channel not supported at moment.\n" ); | |
99 break; | |
100 case PNG_COLOR_TYPE_GRAY: | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
101 out_fmt=IMGFMT_Y800; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
102 break; |
4998 | 103 case PNG_COLOR_TYPE_PALETTE: |
104 out_fmt=IMGFMT_BGR8; | |
105 break; | |
106 case PNG_COLOR_TYPE_RGB_ALPHA: | |
107 out_fmt=IMGFMT_BGR32; | |
108 break; | |
109 case PNG_COLOR_TYPE_RGB: | |
110 out_fmt=IMGFMT_BGR24; | |
111 break; | |
112 default: | |
113 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry, unsupported PNG colorspace: %d.\n" ,info->color_type); | |
114 } | |
115 | |
116 // (re)init libvo if image parameters changed (width/height/colorspace) | |
117 if(last_w!=png_width || last_h!=png_height || last_c!=out_fmt){ | |
118 last_w=png_width; last_h=png_height; last_c=out_fmt; | |
119 if(!out_fmt) return NULL; | |
5124 | 120 if(!mpcodecs_config_vo(sh,png_width,png_height,out_fmt)) return NULL; |
4998 | 121 } |
122 | |
123 #if 0 | |
124 switch( info->color_type ) | |
125 { | |
126 case PNG_COLOR_TYPE_GRAY_ALPHA: printf( "[png] used GrayA -> stripping alpha channel\n" ); break; | |
127 case PNG_COLOR_TYPE_GRAY: printf( "[png] used Gray -> rgb\n" ); break; | |
128 case PNG_COLOR_TYPE_PALETTE: printf( "[png] used palette -> rgb\n" ); break; | |
129 case PNG_COLOR_TYPE_RGB_ALPHA: printf( "[png] used RGBA -> stripping alpha channel\n" ); break; | |
130 case PNG_COLOR_TYPE_RGB: printf( "[png] read rgb datas.\n" ); break; | |
131 } | |
132 #endif | |
133 | |
134 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, | |
135 png_width,png_height); | |
136 if(!mpi) return NULL; | |
137 | |
138 // Let's DECODE! | |
18879 | 139 row_p=malloc( sizeof( png_bytep ) * png_height ); |
4998 | 140 //png_get_rowbytes( png,info ) |
141 for ( i=0; i < png_height; i++ ) row_p[i]=mpi->planes[0] + mpi->stride[0]*i; | |
142 png_read_image( png,row_p ); | |
143 free( row_p ); | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
144 |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
145 if (out_fmt==IMGFMT_BGR8) { |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
146 png_get_PLTE( png,info,&pal,&cols ); |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
147 mpi->planes[1] = (char*)realloc(mpi->planes[1], 4*cols); |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
148 p = mpi->planes[1]; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
149 for (i = 0; i < cols; i++) { |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
150 *p++ = pal[i].blue; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
151 *p++ = pal[i].green; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
152 *p++ = pal[i].red; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
153 *p++ = 0; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
154 } |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
155 } |
4998 | 156 |
157 png_read_end( png,endinfo ); | |
158 png_destroy_read_struct( &png,&info,&endinfo ); | |
159 | |
160 return mpi; | |
161 } |