annotate libmpcodecs/vd_mpng.c @ 25065:54dba785e683

New media format negotiation code: loop through all available formats trying to establish connection between pins. Negotiation stops either when all formats are rejected (error reported in this case) or when connection is established (which can happen only when current media format is accepted by both of the pins).
author voroshil
date Sun, 18 Nov 2007 11:13:28 +0000
parents a124f3abc1ec
children 0f1b5b68af32
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
21372
1767c271d710 Remove bswap.h, use libavutil/bswap.h instead.
diego
parents: 18879
diff changeset
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
11 #include "libvo/fastmemcpy.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
12
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
13 #include "vd_internal.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
14
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
15 static vd_info_t info = {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
16 "PNG Images decoder",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
17 "mpng",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
18 "A'rpi",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
19 ".so, based on mpng.c",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
20 "uses libpng, 8bpp modes not supported yet"
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
23 LIBVD_EXTERN(mpng)
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
24
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
25 static unsigned int out_fmt=0;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
26
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
27 static int last_w=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
28 static int last_h=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
29 static int last_c=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
30
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
31 // to set/get/query special features/parameters
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
39 return CONTROL_UNKNOWN;
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
42 // init driver
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
43 static int init(sh_video_t *sh){
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
44 last_w=-1;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
45 return 1;
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
48 // uninit driver
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
49 static void uninit(sh_video_t *sh){
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
52 //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
53
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
54 static int pngPointer;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
55 static int pngLength;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
56
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
57 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
58 {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
59 char * p = pngstr->io_ptr;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
62 pngPointer+=size;
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
65 // decode a frame
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
66 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
67 png_structp png;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
68 png_infop info;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
69 png_infop endinfo;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
70 // png_bytep data;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
71 png_bytep * row_p;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
72 png_uint_32 png_width=0,png_height=0;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
73 int depth,color;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
74 png_uint_32 i;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
75 mp_image_t* mpi;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
81 if(len<=0) return NULL; // skipped frame
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
82
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
83 png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
84 info=png_create_info_struct( png );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
85 endinfo=png_create_info_struct( png );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
86
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
87 pngPointer=8;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
88 pngLength=len;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
91 png_set_sig_bytes( png,8 );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
92 png_read_info( png,info );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
93 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
94 png_set_bgr( png );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
95
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
96 switch( info->color_type ) {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
97 case PNG_COLOR_TYPE_GRAY_ALPHA:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
98 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
99 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
103 case PNG_COLOR_TYPE_PALETTE:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
104 out_fmt=IMGFMT_BGR8;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
105 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
106 case PNG_COLOR_TYPE_RGB_ALPHA:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
107 out_fmt=IMGFMT_BGR32;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
108 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
109 case PNG_COLOR_TYPE_RGB:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
110 out_fmt=IMGFMT_BGR24;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
111 break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
112 default:
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
113 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
114 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
115
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
116 // (re)init libvo if image parameters changed (width/height/colorspace)
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
117 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
118 last_w=png_width; last_h=png_height; last_c=out_fmt;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
119 if(!out_fmt) return NULL;
5124
3dcbf67c0de0 handle error from mpcodecs_config_vo()
arpi
parents: 4998
diff changeset
120 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
121 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
122
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
123 #if 0
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
124 switch( info->color_type )
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
125 {
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
126 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
127 case PNG_COLOR_TYPE_GRAY: printf( "[png] used Gray -> rgb\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
128 case PNG_COLOR_TYPE_PALETTE: printf( "[png] used palette -> rgb\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
129 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
130 case PNG_COLOR_TYPE_RGB: printf( "[png] read rgb datas.\n" ); break;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
131 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
132 #endif
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
133
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
134 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
135 png_width,png_height);
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
136 if(!mpi) return NULL;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
137
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
138 // Let's DECODE!
18879
cc65a585fdcc rm unnecesary casts from void* - part 3
reynaldo
parents: 18771
diff changeset
139 row_p=malloc( sizeof( png_bytep ) * png_height );
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
140 //png_get_rowbytes( png,info )
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
141 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
142 png_read_image( png,row_p );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
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
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
156
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
157 png_read_end( png,endinfo );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
158 png_destroy_read_struct( &png,&info,&endinfo );
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
159
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
160 return mpi;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
161 }