Mercurial > mplayer.hg
annotate libmpcodecs/vd_mpng.c @ 37169:2c223acee2db
Ensure isprint only gets input it can handle.
Patch by [spunit262 gmail.com].
author | reimar |
---|---|
date | Thu, 04 Sep 2014 18:54:16 +0000 |
parents | 9981c24b59bd |
children |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
18 |
4998 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 | |
22 #include "config.h" | |
23 #include "mp_msg.h" | |
24 | |
25 #include <png.h> | |
26 | |
21372 | 27 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21372
diff
changeset
|
28 #include "mpbswap.h" |
4998 | 29 #include "libvo/fastmemcpy.h" |
30 | |
31 #include "vd_internal.h" | |
32 | |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
33 static const vd_info_t info = { |
4998 | 34 "PNG Images decoder", |
35 "mpng", | |
36 "A'rpi", | |
37 ".so, based on mpng.c", | |
38 "uses libpng, 8bpp modes not supported yet" | |
39 }; | |
40 | |
41 LIBVD_EXTERN(mpng) | |
42 | |
43 static unsigned int out_fmt=0; | |
44 | |
45 static int last_w=-1; | |
46 static int last_h=-1; | |
47 static int last_c=-1; | |
48 | |
49 // to set/get/query special features/parameters | |
50 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
|
51 switch (cmd) |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
52 { |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
53 case VDCTRL_QUERY_FORMAT: |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
54 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
|
55 return CONTROL_FALSE; |
a9448dd2430c
query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents:
7472
diff
changeset
|
56 } |
4998 | 57 return CONTROL_UNKNOWN; |
58 } | |
59 | |
60 // init driver | |
61 static int init(sh_video_t *sh){ | |
62 last_w=-1; | |
63 return 1; | |
64 } | |
65 | |
66 // uninit driver | |
67 static void uninit(sh_video_t *sh){ | |
68 } | |
69 | |
70 //mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h); | |
71 | |
72 static int pngPointer; | |
73 static int pngLength; | |
74 | |
75 static void pngReadFN( png_structp pngstr,png_bytep buffer,png_size_t size ) | |
76 { | |
32753
9981c24b59bd
Use color type getter instead of direct access to private member.
cboesch
parents:
30702
diff
changeset
|
77 char * p = png_get_io_ptr(pngstr); |
4998 | 78 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
|
79 fast_memcpy( buffer,(char *)&p[pngPointer],size ); |
4998 | 80 pngPointer+=size; |
81 } | |
82 | |
83 // decode a frame | |
84 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ | |
85 png_structp png; | |
86 png_infop info; | |
87 png_infop endinfo; | |
88 // png_bytep data; | |
89 png_bytep * row_p; | |
90 png_uint_32 png_width=0,png_height=0; | |
91 int depth,color; | |
92 png_uint_32 i; | |
32753
9981c24b59bd
Use color type getter instead of direct access to private member.
cboesch
parents:
30702
diff
changeset
|
93 png_byte color_type; |
4998 | 94 mp_image_t* mpi; |
95 | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
96 int cols; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
97 png_colorp pal; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
98 unsigned char *p; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
99 |
4998 | 100 if(len<=0) return NULL; // skipped frame |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
101 |
4998 | 102 png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL ); |
103 info=png_create_info_struct( png ); | |
104 endinfo=png_create_info_struct( png ); | |
105 | |
106 pngPointer=8; | |
107 pngLength=len; | |
108 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
|
109 png_set_strip_16( png ); |
4998 | 110 png_set_sig_bytes( png,8 ); |
111 png_read_info( png,info ); | |
112 png_get_IHDR( png,info,&png_width,&png_height,&depth,&color,NULL,NULL,NULL ); | |
113 png_set_bgr( png ); | |
114 | |
32753
9981c24b59bd
Use color type getter instead of direct access to private member.
cboesch
parents:
30702
diff
changeset
|
115 color_type=png_get_color_type(png, info); |
9981c24b59bd
Use color type getter instead of direct access to private member.
cboesch
parents:
30702
diff
changeset
|
116 |
9981c24b59bd
Use color type getter instead of direct access to private member.
cboesch
parents:
30702
diff
changeset
|
117 switch( color_type ) { |
4998 | 118 case PNG_COLOR_TYPE_GRAY_ALPHA: |
119 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry gray scaled png with alpha channel not supported at moment.\n" ); | |
120 break; | |
121 case PNG_COLOR_TYPE_GRAY: | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
122 out_fmt=IMGFMT_Y800; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
123 break; |
4998 | 124 case PNG_COLOR_TYPE_PALETTE: |
125 out_fmt=IMGFMT_BGR8; | |
126 break; | |
127 case PNG_COLOR_TYPE_RGB_ALPHA: | |
128 out_fmt=IMGFMT_BGR32; | |
129 break; | |
130 case PNG_COLOR_TYPE_RGB: | |
131 out_fmt=IMGFMT_BGR24; | |
132 break; | |
133 default: | |
32753
9981c24b59bd
Use color type getter instead of direct access to private member.
cboesch
parents:
30702
diff
changeset
|
134 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry, unsupported PNG colorspace: %d.\n" ,color_type); |
4998 | 135 } |
136 | |
137 // (re)init libvo if image parameters changed (width/height/colorspace) | |
138 if(last_w!=png_width || last_h!=png_height || last_c!=out_fmt){ | |
139 last_w=png_width; last_h=png_height; last_c=out_fmt; | |
140 if(!out_fmt) return NULL; | |
5124 | 141 if(!mpcodecs_config_vo(sh,png_width,png_height,out_fmt)) return NULL; |
4998 | 142 } |
143 | |
144 #if 0 | |
145 switch( info->color_type ) | |
146 { | |
147 case PNG_COLOR_TYPE_GRAY_ALPHA: printf( "[png] used GrayA -> stripping alpha channel\n" ); break; | |
148 case PNG_COLOR_TYPE_GRAY: printf( "[png] used Gray -> rgb\n" ); break; | |
149 case PNG_COLOR_TYPE_PALETTE: printf( "[png] used palette -> rgb\n" ); break; | |
150 case PNG_COLOR_TYPE_RGB_ALPHA: printf( "[png] used RGBA -> stripping alpha channel\n" ); break; | |
151 case PNG_COLOR_TYPE_RGB: printf( "[png] read rgb datas.\n" ); break; | |
152 } | |
153 #endif | |
154 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
155 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, |
4998 | 156 png_width,png_height); |
157 if(!mpi) return NULL; | |
158 | |
159 // Let's DECODE! | |
18879 | 160 row_p=malloc( sizeof( png_bytep ) * png_height ); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
161 //png_get_rowbytes( png,info ) |
4998 | 162 for ( i=0; i < png_height; i++ ) row_p[i]=mpi->planes[0] + mpi->stride[0]*i; |
163 png_read_image( png,row_p ); | |
164 free( row_p ); | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
165 |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
166 if (out_fmt==IMGFMT_BGR8) { |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
167 png_get_PLTE( png,info,&pal,&cols ); |
30702 | 168 mpi->planes[1] = realloc(mpi->planes[1], 4*cols); |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
169 p = mpi->planes[1]; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
170 for (i = 0; i < cols; i++) { |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
171 *p++ = pal[i].blue; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
172 *p++ = pal[i].green; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
173 *p++ = pal[i].red; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
174 *p++ = 0; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
175 } |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
176 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
177 |
4998 | 178 png_read_end( png,endinfo ); |
179 png_destroy_read_struct( &png,&info,&endinfo ); | |
180 | |
181 return mpi; | |
182 } |