Mercurial > mplayer.hg
view TOOLS/png2raw.c @ 16805:50fb26acbcba
processing audio is sometimes essential for a/v sync, so 1000l to
whoever made rawvideo muxer disable audio!!
with this patch, audio is processed but simply thrown away by the
muxer. various 'error' conditions in rawvideo muxer are removed to
make it work. feel free to re-add them if they can be done without
breaking anything, but do not use printf !!!!
btw old behavior can be obtained by manually specifying -nosound.
author | rfelker |
---|---|
date | Wed, 19 Oct 2005 05:44:27 +0000 |
parents | bf973bffe240 |
children |
line wrap: on
line source
#define DEBUG #include <stdlib.h> //#include "png.h" #include <png.h> typedef struct _txSample { unsigned int Width; unsigned int Height; unsigned int BPP; unsigned long ImageSize; char * Image; } txSample; typedef struct { unsigned int Width; unsigned int Height; unsigned int Depth; unsigned int Alpha; unsigned int Components; unsigned char * Data; unsigned char * Palette; } pngRawInfo; int pngLoadRawF( FILE *fp,pngRawInfo *pinfo ) { unsigned char header[8]; png_structp png; png_infop info; png_infop endinfo; png_bytep data; png_bytep * row_p; png_uint_32 width,height; int depth,color; png_uint_32 i; if ( pinfo == NULL ) return 1; fread( header,1,8,fp ); if ( !png_check_sig( header,8 ) ) return 1; png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL ); info=png_create_info_struct( png ); endinfo=png_create_info_struct( png ); png_init_io( png,fp ); png_set_sig_bytes( png,8 ); png_read_info( png,info ); png_get_IHDR( png,info,&width,&height,&depth,&color,NULL,NULL,NULL ); pinfo->Width=width; pinfo->Height=height; pinfo->Depth=depth; data=( png_bytep ) malloc( png_get_rowbytes( png,info )*height ); row_p=( png_bytep * ) malloc( sizeof( png_bytep )*height ); for ( i=0; i < height; i++ ) row_p[i]=&data[png_get_rowbytes( png,info )*i]; png_read_image( png,row_p ); free( row_p ); if ( color == PNG_COLOR_TYPE_PALETTE ) { int cols; png_get_PLTE( png,info,( png_colorp * ) &pinfo->Palette,&cols ); } else pinfo->Palette=NULL; if ( color&PNG_COLOR_MASK_ALPHA ) { if ( color&PNG_COLOR_MASK_PALETTE || color == PNG_COLOR_TYPE_GRAY_ALPHA ) pinfo->Components=2; else pinfo->Components=4; pinfo->Alpha=8; } else { if ( color&PNG_COLOR_MASK_PALETTE || color == PNG_COLOR_TYPE_GRAY ) pinfo->Components=1; else pinfo->Components=3; pinfo->Alpha=0; } pinfo->Data=data; png_read_end( png,endinfo ); png_destroy_read_struct( &png,&info,&endinfo ); return 0; } int pngLoadRaw( const char *filename,pngRawInfo *pinfo ) { int result; FILE *fp=fopen( filename,"rb" ); if ( fp == NULL ) return 0; result=pngLoadRawF( fp,pinfo ); if ( fclose( fp ) != 0 ) { if ( result ) { free( pinfo->Data ); free( pinfo->Palette ); } return 1; } return 0; } int pngRead( unsigned char * fname,txSample * bf ) { pngRawInfo raw; if ( pngLoadRaw( fname,&raw ) ) { #ifdef DEBUG fprintf( stderr,"[png] file read error ( %s ).\n",fname ); #endif return 1; } bf->Width=raw.Width; bf->Height=raw.Height; bf->BPP=( raw.Depth * raw.Components ) + raw.Alpha; bf->ImageSize=bf->Width * bf->Height * ( bf->BPP / 8 ); if ( ( bf->Image=malloc( bf->ImageSize ) ) == NULL ) { #ifdef DEBUG fprintf( stderr,"[png] Not enough memory for image buffer.\n" ); #endif return 2; } memcpy( bf->Image,raw.Data,bf->ImageSize ); free( raw.Data ); #ifdef DEBUG fprintf( stderr,"[png] filename: %s.\n",fname ); fprintf( stderr,"[png] size: %dx%d bits: %d\n",bf->Width,bf->Height,bf->BPP ); fprintf( stderr,"[png] imagesize: %lu\n",bf->ImageSize ); fprintf( stderr,"Palette: %s\n",raw.Palette?"yes":"no"); #endif return 0; } static char fname[256]; static unsigned char rawhead[32]={'m','h','w','a','n','h',0,4, 0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}; static unsigned char rawpal[3*256]; int main(int argc,char* argv[]){ txSample ize; FILE *f; int i; for(i=0;i<256;i++) rawpal[i*3]=rawpal[i*3+1]=rawpal[i*3+2]=i; if(argc<2) {printf("Usage: png2raw file1 [file2...]\n");exit(1);} while(argc>1){ ++argv;--argc; printf("Converting %s...\n",argv[0]); if(pngRead(argv[0],&ize)) continue; if(ize.BPP!=8){ printf("Invalid BPP: %d\n",ize.BPP);continue;} snprintf(fname,256,"%s.raw",argv[0]); f=fopen(fname,"wb"); rawhead[8]=ize.Width>>8; rawhead[9]=ize.Width&255; rawhead[10]=ize.Height>>8; rawhead[11]=ize.Height&255; fwrite(rawhead,32,1,f); fwrite(rawpal,3*256,1,f); fwrite(ize.Image,ize.ImageSize,1,f); fclose(f); } }