summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--codec-cfg.c1
-rw-r--r--codec-cfg.h1
-rwxr-xr-xconfigure4
-rw-r--r--dec_video.c23
-rw-r--r--etc/codecs.conf7
-rw-r--r--libmpdemux/demux_mf.c10
-rw-r--r--mpng.c106
8 files changed, 152 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index 6a5608b7c7..daf529c4bc 100644
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,10 @@ SRCS_MPLAYER = mplayer.c $(SRCS_COMMON) find_sub.c subreader.c lirc_mp.c mixer.c
OBJS_MENCODER = $(SRCS_MENCODER:.c=.o)
OBJS_MPLAYER = $(SRCS_MPLAYER:.c=.o)
+ifeq ($(PNG),yes)
+SRCS_COMMON += mpng.c
+endif
+
ifeq ($(VO2),yes)
VO_LIBS = -Llibvo2 -lvo2
VO_INC = -Ilibvo2
diff --git a/codec-cfg.c b/codec-cfg.c
index 6fd5e02ed0..9c8ec19cf5 100644
--- a/codec-cfg.c
+++ b/codec-cfg.c
@@ -246,6 +246,7 @@ static short get_driver(char *s,int audioflag)
"ducktm1",
"roqvideo",
"qtrpza",
+ "mpng",
NULL
};
char **drv=audioflag?audiodrv:videodrv;
diff --git a/codec-cfg.h b/codec-cfg.h
index 90ee14ba63..86fed658d2 100644
--- a/codec-cfg.h
+++ b/codec-cfg.h
@@ -58,6 +58,7 @@
#define VFM_DUCKTM1 18
#define VFM_ROQVIDEO 19
#define VFM_QTRPZA 20
+#define VFM_MPNG 21
#ifndef GUID_TYPE
#define GUID_TYPE
diff --git a/configure b/configure
index aa9164808f..297634e4e9 100755
--- a/configure
+++ b/configure
@@ -1935,8 +1935,10 @@ if test "$_png" = yes ; then
_ld_png='-lpng -lz'
_vosrc="$_vosrc vo_png.c"
_vomodules="png $_vomodules"
+ _mkf_png="yes"
else
_def_png='#undef HAVE_PNG'
+ _mkf_png="no"
fi
@@ -2948,6 +2950,8 @@ OPENDIVX = $_opendivx
VO2 = $_vo2
+PNG = $_mkf_png
+
EXTRA_LIB = $_ld_extra
Z_LIB = $_ld_static $_ld_zlib
HAVE_MLIB = $_mlib
diff --git a/dec_video.c b/dec_video.c
index c96674ffdc..e9e3c456df 100644
--- a/dec_video.c
+++ b/dec_video.c
@@ -180,6 +180,16 @@ void decode_duck_tm1(
int height,
int bytes_per_pixel);
+#ifdef HAVE_PNG
+void decode_mpng(
+ unsigned char *encoded,
+ int encoded_size,
+ unsigned char *decoded,
+ int width,
+ int height,
+ int bytes_per_pixel);
+#endif
+
void qt_decode_rpza(
unsigned char *encoded,
int encoded_size,
@@ -706,6 +716,9 @@ switch(sh_video->codec->driver){
case VFM_FLI:
case VFM_QTRLE:
case VFM_DUCKTM1:
+#ifdef HAVE_PNG
+ case VFM_MPNG:
+#endif
case VFM_QTRPZA:
{
#ifdef USE_MP_IMAGE
@@ -1139,6 +1152,16 @@ if(verbose>1){
((out_fmt&255)+7)/8);
blit_frame = 3;
break;
+#ifdef HAVE_PNG
+ case VFM_MPNG:
+ decode_mpng(
+ start, in_size, sh_video->our_out_buffer,
+ sh_video->disp_w,sh_video->disp_h,
+ 24
+ );
+ blit_frame = 3;
+ break;
+#endif
case VFM_CYUV:
decode_cyuv(start, in_size, sh_video->our_out_buffer,
sh_video->disp_w, sh_video->disp_h, (out_fmt==IMGFMT_YUY2)?16:(out_fmt&255));
diff --git a/etc/codecs.conf b/etc/codecs.conf
index f02cc5870e..34e32e7189 100644
--- a/etc/codecs.conf
+++ b/etc/codecs.conf
@@ -347,6 +347,13 @@ videocodec ducktm1
driver ducktm1
out BGR32,BGR24,BGR16,BGR15
+videocodec mpng
+ info "mPNG codec"
+ status buggy
+ fourcc mpng,MPNG
+ driver mpng
+ out BGR24
+
videocodec roqvideo
info "Id RoQ File Video Decoder"
status buggy
diff --git a/libmpdemux/demux_mf.c b/libmpdemux/demux_mf.c
index e594a1e557..c416882986 100644
--- a/libmpdemux/demux_mf.c
+++ b/libmpdemux/demux_mf.c
@@ -76,7 +76,7 @@ demuxer_t* demux_open_mf(demuxer_t* demuxer){
// go back to the beginning
stream_reset(demuxer->stream);
- stream_seek(demuxer->stream, 0);
+// stream_seek(demuxer->stream, 0);
demuxer->movi_start = 0;
demuxer->movi_end = mf->nr_of_files - 1;
dmf->nr_of_frames= mf->nr_of_files;
@@ -93,9 +93,11 @@ demuxer_t* demux_open_mf(demuxer_t* demuxer){
// video_read_properties() will choke
sh_video->ds = demuxer->video;
- if ( !strcasecmp( mf_type,"jpg" ) ||
- !(strcasecmp(mf_type, "jpeg"))) sh_video->format = mmioFOURCC('M', 'J', 'P', 'G');
- else { mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] unknow input file type.\n" ); free( dmf ); return NULL; }
+ if ( !strcasecmp( mf_type,"jpg" ) ||
+ !(strcasecmp(mf_type, "jpeg"))) sh_video->format = mmioFOURCC('M', 'J', 'P', 'G');
+ else
+ if ( !strcasecmp( mf_type,"png" )) sh_video->format = mmioFOURCC('M', 'P', 'N', 'G' );
+ else { mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] unknow input file type.\n" ); free( dmf ); return NULL; }
sh_video->disp_w = mf_w;
sh_video->disp_h = mf_h;
diff --git a/mpng.c b/mpng.c
new file mode 100644
index 0000000000..8794215941
--- /dev/null
+++ b/mpng.c
@@ -0,0 +1,106 @@
+
+#include <stdlib.h>
+
+#include "config.h"
+#include "bswap.h"
+#include "postproc/rgb2rgb.h"
+#include "mp_msg.h"
+#include "png.h"
+
+int pngPointer;
+
+void pngReadFN( png_structp pngstr,png_bytep buffer,png_size_t size )
+{
+ char * p = pngstr->io_ptr;
+ memcpy( buffer,(char *)&p[pngPointer],size );
+ pngPointer+=size;
+}
+
+void decode_mpng(
+ unsigned char *encoded,
+ int encoded_size,
+ unsigned char *decoded,
+ int width,
+ int height,
+ int bytes_per_pixel)
+{
+ png_structp png;
+ png_infop info;
+ png_infop endinfo;
+ png_bytep data;
+ png_bytep * row_p;
+ png_uint_32 png_width,png_height;
+ char * palette = NULL;
+ int depth,color;
+ png_uint_32 i;
+ png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL );
+ info=png_create_info_struct( png );
+ endinfo=png_create_info_struct( png );
+
+ pngPointer=8;
+ png_set_read_fn( png,encoded,pngReadFN );
+ png_set_sig_bytes( png,8 );
+ png_read_info( png,info );
+ png_get_IHDR( png,info,&png_width,&png_height,&depth,&color,NULL,NULL,NULL );
+
+ png_set_bgr( png );
+
+#if 0
+ switch( info->color_type )
+ {
+ case PNG_COLOR_TYPE_GRAY_ALPHA: printf( "[png] used GrayA -> stripping alpha channel\n" ); break;
+ case PNG_COLOR_TYPE_GRAY: printf( "[png] used Gray -> rgb\n" ); break;
+ case PNG_COLOR_TYPE_PALETTE: printf( "[png] used palette -> rgb\n" ); break;
+ case PNG_COLOR_TYPE_RGB_ALPHA: printf( "[png] used RGBA -> stripping alpha channel\n" ); break;
+ case PNG_COLOR_TYPE_RGB: printf( "[png] read rgb datas.\n" ); break;
+ }
+#endif
+
+ if ( info->color_type == PNG_COLOR_TYPE_RGB ) data=decoded;
+ else data=(png_bytep)malloc( png_get_rowbytes( png,info ) * height );
+
+ row_p=(png_bytep*)malloc( sizeof( png_bytep ) * png_height );
+ for ( i=0; i < png_height; i++ ) row_p[i]=&data[png_get_rowbytes( png,info ) * i];
+ png_read_image( png,row_p );
+ free( row_p );
+
+ switch( info->color_type )
+ {
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry gray scaled png with alpha channel not supported at moment.\n" );
+ free( data );
+ break;
+ case PNG_COLOR_TYPE_GRAY:
+ palette=malloc( 1024 );
+ for ( i=0;i < 256;i++ ) palette[(i*4)]=palette[(i*4)+1]=palette[(i*4)+2]=(char)i;
+ palette8torgb24( data,decoded,png_width * png_height,palette );
+ free( data );
+ break;
+ case PNG_COLOR_TYPE_PALETTE:
+ {
+ int cols;
+ unsigned char * pal;
+ png_get_PLTE( png,info,(png_colorp*)&pal,&cols );
+ palette=calloc( 1,1024 );
+ for ( i=0;i < cols;i++ )
+ {
+ palette[(i*4) ]=pal[(i*3)+2];
+ palette[(i*4)+1]=pal[(i*3)+1];
+ palette[(i*4)+2]=pal[(i*3) ];
+ }
+ }
+ palette8torgb24( data,decoded,png_width * png_height,palette );
+ free( data );
+ break;
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ rgb32to24( data,decoded,png_width * png_height * 4 );
+ free( data );
+ break;
+ }
+
+ if ( palette ) free( palette );
+
+ png_read_end( png,endinfo );
+ png_destroy_read_struct( &png,&info,&endinfo );
+}
+