From 97654ce7f3c6f711b270487d2f43f70c8e872024 Mon Sep 17 00:00:00 2001 From: pontscho Date: Mon, 11 Feb 2002 09:15:59 +0000 Subject: add initial mPNG support git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4657 b3059339-0415-0410-9bf9-f77b7e298cf2 --- Makefile | 4 ++ codec-cfg.c | 1 + codec-cfg.h | 1 + configure | 4 ++ dec_video.c | 23 +++++++++++ etc/codecs.conf | 7 ++++ libmpdemux/demux_mf.c | 10 +++-- mpng.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 mpng.c 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 + +#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 ); +} + -- cgit v1.2.3