Mercurial > mplayer.hg
annotate libmpcodecs/vd_mpng.c @ 31246:cc6ee3017097
Limit buffered PTS only when we actually got a frame from the decoder.
This avoids some issues with H.264 PAFF due to dropping PTS values too
early because only every second packet actually produced output.
Just keeping up to one additional pts value would have avoided this
particular issue as well, but this is more generic.
author | reimar |
---|---|
date | Thu, 03 Jun 2010 20:59:40 +0000 |
parents | 9fc9d1e788aa |
children | 9981c24b59bd |
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 { | |
77 char * p = pngstr->io_ptr; | |
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; | |
93 mp_image_t* mpi; | |
94 | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
95 int cols; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
96 png_colorp pal; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
97 unsigned char *p; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
98 |
4998 | 99 if(len<=0) return NULL; // skipped frame |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
100 |
4998 | 101 png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL ); |
102 info=png_create_info_struct( png ); | |
103 endinfo=png_create_info_struct( png ); | |
104 | |
105 pngPointer=8; | |
106 pngLength=len; | |
107 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
|
108 png_set_strip_16( png ); |
4998 | 109 png_set_sig_bytes( png,8 ); |
110 png_read_info( png,info ); | |
111 png_get_IHDR( png,info,&png_width,&png_height,&depth,&color,NULL,NULL,NULL ); | |
112 png_set_bgr( png ); | |
113 | |
114 switch( info->color_type ) { | |
115 case PNG_COLOR_TYPE_GRAY_ALPHA: | |
116 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry gray scaled png with alpha channel not supported at moment.\n" ); | |
117 break; | |
118 case PNG_COLOR_TYPE_GRAY: | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
119 out_fmt=IMGFMT_Y800; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
120 break; |
4998 | 121 case PNG_COLOR_TYPE_PALETTE: |
122 out_fmt=IMGFMT_BGR8; | |
123 break; | |
124 case PNG_COLOR_TYPE_RGB_ALPHA: | |
125 out_fmt=IMGFMT_BGR32; | |
126 break; | |
127 case PNG_COLOR_TYPE_RGB: | |
128 out_fmt=IMGFMT_BGR24; | |
129 break; | |
130 default: | |
131 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry, unsupported PNG colorspace: %d.\n" ,info->color_type); | |
132 } | |
133 | |
134 // (re)init libvo if image parameters changed (width/height/colorspace) | |
135 if(last_w!=png_width || last_h!=png_height || last_c!=out_fmt){ | |
136 last_w=png_width; last_h=png_height; last_c=out_fmt; | |
137 if(!out_fmt) return NULL; | |
5124 | 138 if(!mpcodecs_config_vo(sh,png_width,png_height,out_fmt)) return NULL; |
4998 | 139 } |
140 | |
141 #if 0 | |
142 switch( info->color_type ) | |
143 { | |
144 case PNG_COLOR_TYPE_GRAY_ALPHA: printf( "[png] used GrayA -> stripping alpha channel\n" ); break; | |
145 case PNG_COLOR_TYPE_GRAY: printf( "[png] used Gray -> rgb\n" ); break; | |
146 case PNG_COLOR_TYPE_PALETTE: printf( "[png] used palette -> rgb\n" ); break; | |
147 case PNG_COLOR_TYPE_RGB_ALPHA: printf( "[png] used RGBA -> stripping alpha channel\n" ); break; | |
148 case PNG_COLOR_TYPE_RGB: printf( "[png] read rgb datas.\n" ); break; | |
149 } | |
150 #endif | |
151 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
152 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, |
4998 | 153 png_width,png_height); |
154 if(!mpi) return NULL; | |
155 | |
156 // Let's DECODE! | |
18879 | 157 row_p=malloc( sizeof( png_bytep ) * png_height ); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
158 //png_get_rowbytes( png,info ) |
4998 | 159 for ( i=0; i < png_height; i++ ) row_p[i]=mpi->planes[0] + mpi->stride[0]*i; |
160 png_read_image( png,row_p ); | |
161 free( row_p ); | |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
162 |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
163 if (out_fmt==IMGFMT_BGR8) { |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
164 png_get_PLTE( png,info,&pal,&cols ); |
30702 | 165 mpi->planes[1] = realloc(mpi->planes[1], 4*cols); |
15502
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
166 p = mpi->planes[1]; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
167 for (i = 0; i < cols; i++) { |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
168 *p++ = pal[i].blue; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
169 *p++ = pal[i].green; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
170 *p++ = pal[i].red; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
171 *p++ = 0; |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
172 } |
ef7349907cf4
8bit palette mode support (and spurious ^M removal)
henry
parents:
11566
diff
changeset
|
173 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
23457
diff
changeset
|
174 |
4998 | 175 png_read_end( png,endinfo ); |
176 png_destroy_read_struct( &png,&info,&endinfo ); | |
177 | |
178 return mpi; | |
179 } |