annotate libmpcodecs/vd_mpng.c @ 21033:087cad309e9c

if in the list of pids appears at least one 8192 (while TS) remove all other pid filters and don't add pid 0, either
author nicodvb
date Sun, 19 Nov 2006 12:05:11 +0000
parents cc65a585fdcc
children 1767c271d710
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
1 #include <stdio.h>
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
2 #include <stdlib.h>
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
3
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
4 #include "config.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
5 #include "mp_msg.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
6
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
7 #include <png.h>
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
8
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
9 #include "bswap.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
10 #include "libvo/fastmemcpy.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
11
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
12 #include "vd_internal.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
13
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
14 static vd_info_t info = {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
15 "PNG Images decoder",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
16 "mpng",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
17 "A'rpi",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
18 ".so, based on mpng.c",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
19 "uses libpng, 8bpp modes not supported yet"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
20 };
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
21
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
22 LIBVD_EXTERN(mpng)
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
23
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
24 static unsigned int out_fmt=0;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
25
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
26 static int last_w=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
27 static int last_h=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
28 static int last_c=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
29
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
30 // to set/get/query special features/parameters
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
31 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
32 switch (cmd)
a9448dd2430c query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents: 7472
diff changeset
33 {
a9448dd2430c query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents: 7472
diff changeset
34 case VDCTRL_QUERY_FORMAT:
a9448dd2430c query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents: 7472
diff changeset
35 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
36 return CONTROL_FALSE;
a9448dd2430c query_format support by Matthias Goerner <m.goerner@iu-bremen.de>
alex
parents: 7472
diff changeset
37 }
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
38 return CONTROL_UNKNOWN;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
39 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
40
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
41 // init driver
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
42 static int init(sh_video_t *sh){
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
43 last_w=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
44 return 1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
45 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
46
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
47 // uninit driver
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
48 static void uninit(sh_video_t *sh){
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
49 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
50
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
51 //mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h);
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
52
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
53 static int pngPointer;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
54 static int pngLength;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
55
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
56 static void pngReadFN( png_structp pngstr,png_bytep buffer,png_size_t size )
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
57 {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
58 char * p = pngstr->io_ptr;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
59 if(size>pngLength-pngPointer && pngLength>=pngPointer) size=pngLength-pngPointer;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
60 memcpy( buffer,(char *)&p[pngPointer],size );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
61 pngPointer+=size;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
62 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
63
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
64 // decode a frame
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
65 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
66 png_structp png;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
67 png_infop info;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
68 png_infop endinfo;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
69 // png_bytep data;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
70 png_bytep * row_p;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
71 png_uint_32 png_width=0,png_height=0;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
72 int depth,color;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
73 png_uint_32 i;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
74 mp_image_t* mpi;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
75
15502
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
76 int cols;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
77 png_colorp pal;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
78 unsigned char *p;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
79
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
80 if(len<=0) return NULL; // skipped frame
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
81
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
82 png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
83 info=png_create_info_struct( png );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
84 endinfo=png_create_info_struct( png );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
85
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
86 pngPointer=8;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
87 pngLength=len;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
88 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
89 png_set_strip_16( png );
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
90 png_set_sig_bytes( png,8 );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
91 png_read_info( png,info );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
92 png_get_IHDR( png,info,&png_width,&png_height,&depth,&color,NULL,NULL,NULL );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
93 png_set_bgr( png );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
94
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
95 switch( info->color_type ) {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
96 case PNG_COLOR_TYPE_GRAY_ALPHA:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
97 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry gray scaled png with alpha channel not supported at moment.\n" );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
98 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
99 case PNG_COLOR_TYPE_GRAY:
15502
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
100 out_fmt=IMGFMT_Y800;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
101 break;
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
102 case PNG_COLOR_TYPE_PALETTE:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
103 out_fmt=IMGFMT_BGR8;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
104 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
105 case PNG_COLOR_TYPE_RGB_ALPHA:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
106 out_fmt=IMGFMT_BGR32;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
107 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
108 case PNG_COLOR_TYPE_RGB:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
109 out_fmt=IMGFMT_BGR24;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
110 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
111 default:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
112 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry, unsupported PNG colorspace: %d.\n" ,info->color_type);
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
113 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
114
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
115 // (re)init libvo if image parameters changed (width/height/colorspace)
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
116 if(last_w!=png_width || last_h!=png_height || last_c!=out_fmt){
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
117 last_w=png_width; last_h=png_height; last_c=out_fmt;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
118 if(!out_fmt) return NULL;
5124
3dcbf67c0de0 handle error from mpcodecs_config_vo()
arpi
parents: 4998
diff changeset
119 if(!mpcodecs_config_vo(sh,png_width,png_height,out_fmt)) return NULL;
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
120 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
121
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
122 #if 0
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
123 switch( info->color_type )
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
124 {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
125 case PNG_COLOR_TYPE_GRAY_ALPHA: printf( "[png] used GrayA -> stripping alpha channel\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
126 case PNG_COLOR_TYPE_GRAY: printf( "[png] used Gray -> rgb\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
127 case PNG_COLOR_TYPE_PALETTE: printf( "[png] used palette -> rgb\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
128 case PNG_COLOR_TYPE_RGB_ALPHA: printf( "[png] used RGBA -> stripping alpha channel\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
129 case PNG_COLOR_TYPE_RGB: printf( "[png] read rgb datas.\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
130 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
131 #endif
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
132
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
133 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
134 png_width,png_height);
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
135 if(!mpi) return NULL;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
136
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
137 // Let's DECODE!
18879
cc65a585fdcc rm unnecesary casts from void* - part 3
reynaldo
parents: 18771
diff changeset
138 row_p=malloc( sizeof( png_bytep ) * png_height );
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
139 //png_get_rowbytes( png,info )
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
140 for ( i=0; i < png_height; i++ ) row_p[i]=mpi->planes[0] + mpi->stride[0]*i;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
141 png_read_image( png,row_p );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
142 free( row_p );
15502
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
143
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
144 if (out_fmt==IMGFMT_BGR8) {
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
145 png_get_PLTE( png,info,&pal,&cols );
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
146 mpi->planes[1] = (char*)realloc(mpi->planes[1], 4*cols);
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
147 p = mpi->planes[1];
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
148 for (i = 0; i < cols; i++) {
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
149 *p++ = pal[i].blue;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
150 *p++ = pal[i].green;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
151 *p++ = pal[i].red;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
152 *p++ = 0;
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
153 }
ef7349907cf4 8bit palette mode support (and spurious ^M removal)
henry
parents: 11566
diff changeset
154 }
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
155
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
156 png_read_end( png,endinfo );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
157 png_destroy_read_struct( &png,&info,&endinfo );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
158
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
159 return mpi;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
160 }