1
0
mirror of https://github.com/mpv-player/mpv synced 2025-01-11 17:39:38 +00:00

Add IJPG decoder.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5030 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
pontscho 2002-03-10 22:49:18 +00:00
parent 4d60c8c8c6
commit f9f6c9fd93
9 changed files with 260 additions and 3 deletions

View File

@ -55,7 +55,7 @@ else
VO_LIBS = -Llibvo -lvo
VO_INC = -Ilibvo
endif
V_LIBS = $(X_LIB) $(MP1E_LIB) $(GGI_LIB) $(MLIB_LIB) $(PNG_LIB) $(SDL_LIB) $(SVGA_LIB) $(AA_LIB) $(DIRECTFB_LIB)
V_LIBS = $(X_LIB) $(MP1E_LIB) $(GGI_LIB) $(MLIB_LIB) $(JPEG_LIB) $(PNG_LIB) $(SDL_LIB) $(SVGA_LIB) $(AA_LIB) $(DIRECTFB_LIB)
AO_LIBS = -Llibao2 -lao2
A_LIBS = $(ALSA_LIB) $(NAS_LIB) $(MAD_LIB) $(VORBIS_LIB) $(SGIAUDIO_LIB)

View File

@ -252,6 +252,7 @@ static short get_driver(char *s,int audioflag)
"roqvideo",
"qtrpza",
"mpng",
"ijpg",
NULL
};
char **drv=audioflag?audiodrv:videodrv;

View File

@ -60,6 +60,7 @@
#define VFM_ROQVIDEO 19
#define VFM_QTRPZA 20
#define VFM_MPNG 21
#define VFM_IJPG 22
#ifndef GUID_TYPE
#define GUID_TYPE

43
configure vendored
View File

@ -120,6 +120,8 @@ Optional features:
--enable-termcap use termcap database for key codes [autodetect]
--enable-lirc enable LIRC (remote control) support [autodetect]
--enable-gui enable GUI [disable]
--enable-png enable png support [autodetect]
--enable-jpeg enable jpeg support [autodetect]
--disable-tv disable TV Interface (tv/dvb grabbers) [enable]
--disable-tv-v4l disable Video 4 Linux TV Interface support [autodetect]
--disable-win32 disable Win32 DLL support [autodetect]
@ -737,6 +739,7 @@ _xv=auto
_sdl=auto
_nas=auto
_png=auto
_jpg=auto
_gl=auto
_ggi=auto
_aa=auto
@ -816,6 +819,8 @@ for ac_option do
--disable-nas) _nas=no ;;
--enable-png) _png=yes ;;
--disable-png) _png=no ;;
--enable-jpeg) _jpg=yes ;;
--disable-jpeg) _jpg=no ;;
--enable-gl) _gl=yes ;;
--disable-gl) _gl=no ;;
--enable-ggi) _ggi=yes ;;
@ -1978,6 +1983,39 @@ else
_mkf_png="no"
fi
echocheck "JPEG support"
if test "$_jpg" = auto ; then
_jpg=no
cat > $TMPC << EOF
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <string.h>
#include <jpeglib.h>
int main(void) {
return 0;
}
EOF
if cc_check -ljpeg -lm ; then
if "$TMPO" >> "$TMPLOG" ; then
_jpg=yes
echores yes
fi
else
echores no
fi
else
echores "$_jpg"
fi
if test "$_jpg" = yes ; then
_def_jpg='#define HAVE_JPEG 1'
_ld_jpg='-ljpeg'
_mkf_jpg="yes"
else
_def_jpg='#undef HAVE_JPEG'
_mkf_jpg="no"
fi
if test "$_vesa" != no ; then
echocheck "VESA support"
@ -3061,6 +3099,7 @@ OPENDIVX = $_opendivx
VO2 = $_vo2
PNG = $_mkf_png
JPEG = $_mkf_jpg
EXTRA_LIB = $_ld_extra
Z_LIB = $_ld_static $_ld_zlib
@ -3076,6 +3115,7 @@ GGI_LIB = $_ld_ggi
MLIB_LIB = $_ld_mlib
MLIB_INC = $_inc_mlib
PNG_LIB = $_ld_png
JPEG_LIB = $_ld_jpg
SDL_LIB = $_ld_sdl
SVGA_LIB = $_ld_svga
AA_LIB = $_ld_aa
@ -3359,6 +3399,9 @@ $_def_termios_sys_h
/* enable PNG support */
$_def_png
/* enable JPEG support */
$_def_jpg
/* libmad support */
$_def_mad

View File

@ -361,6 +361,14 @@ videocodec mpng
driver mpng
out BGR32,BGR24
videocodec ijpg
info "IJPG codec"
status working
comment "Hm."
fourcc ijpg,IJPG
driver ijpg
out BGR24,BGR8
videocodec roqvideo
info "Id RoQ File Video Decoder"
status buggy

View File

@ -3,7 +3,15 @@ include ../config.mak
LIBNAME = libmpcodecs.a
SRCS=dec_video.c vd.c vd_null.c vd_cinepak.c vd_qtrpza.c vd_ffmpeg.c vd_dshow.c vd_vfw.c vd_odivx.c vd_divx4.c vd_raw.c vd_xanim.c vd_rle.c vd_msvidc.c vd_fli.c vd_qtrle.c vd_qtsmc.c vd_roqvideo.c vd_cyuv.c vd_nuv.c vd_mpng.c vd_libmpeg2.c
SRCS=dec_video.c vd.c vd_null.c vd_cinepak.c vd_qtrpza.c vd_ffmpeg.c vd_dshow.c vd_vfw.c vd_odivx.c vd_divx4.c vd_raw.c vd_xanim.c vd_rle.c vd_msvidc.c vd_fli.c vd_qtrle.c vd_qtsmc.c vd_roqvideo.c vd_cyuv.c vd_nuv.c vd_libmpeg2.c
ifeq ($(PNG),yes)
SRCS += vd_mpng.c
endif
ifeq ($(JPEG),yes)
SRCS += vd_ijpg.c
endif
OBJS=$(SRCS:.c=.o)

View File

@ -41,6 +41,7 @@ extern vd_functions_t mpcodecs_vd_roqvideo;
extern vd_functions_t mpcodecs_vd_cyuv;
extern vd_functions_t mpcodecs_vd_nuv;
extern vd_functions_t mpcodecs_vd_mpng;
extern vd_functions_t mpcodecs_vd_ijpg;
extern vd_functions_t mpcodecs_vd_libmpeg2;
vd_functions_t* mpcodecs_vd_drivers[] = {
@ -77,6 +78,9 @@ vd_functions_t* mpcodecs_vd_drivers[] = {
#endif
#ifdef HAVE_PNG
&mpcodecs_vd_mpng,
#endif
#ifdef HAVE_JPEG
&mpcodecs_vd_ijpg,
#endif
&mpcodecs_vd_libmpeg2,
NULL

192
libmpcodecs/vd_ijpg.c Normal file
View File

@ -0,0 +1,192 @@
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#include "mp_msg.h"
#include <jconfig.h>
#include <jmorecfg.h>
#include <jpeglib.h>
#include <jpegint.h>
#include <jerror.h>
#include <setjmp.h>
#include "bswap.h"
#include "postproc/rgb2rgb.h"
#include "libvo/fastmemcpy.h"
#include "vd_internal.h"
static vd_info_t info = {
"JPEG Images decoder",
"ijpg",
VFM_IJPG,
"Pontscho",
"based on vd_mpng.c",
"uses Indipended JPEG Group's jpeglib"
};
LIBVD_EXTERN(ijpg)
static unsigned int out_fmt=0;
static int last_w=-1;
static int last_h=-1;
static int last_c=-1;
// to set/get/query special features/parameters
static int control(sh_video_t *sh,int cmd,void* arg,...){
return CONTROL_UNKNOWN;
}
// init driver
static int init(sh_video_t *sh){
last_w=-1;
return 1;
}
// uninit driver
static void uninit(sh_video_t *sh){
}
//mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h);
typedef struct
{
struct jpeg_source_mgr pub;
unsigned char * inbuf;
int bufsize;
} my_source_mgr;
typedef my_source_mgr * my_src_ptr;
METHODDEF(void) init_source (j_decompress_ptr cinfo)
{
}
METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo)
{
my_src_ptr src = (my_src_ptr) cinfo->src;
size_t nbytes;
src->pub.next_input_byte = src->inbuf;
src->pub.bytes_in_buffer = src->bufsize;
return TRUE;
}
METHODDEF(void) skip_input_data (j_decompress_ptr cinfo, long num_bytes)
{
my_src_ptr src = (my_src_ptr) cinfo->src;
if (num_bytes > 0)
{
while (num_bytes > (long) src->pub.bytes_in_buffer)
{
num_bytes -= (long) src->pub.bytes_in_buffer;
(void) fill_input_buffer(cinfo);
}
src->pub.next_input_byte += (size_t) num_bytes;
src->pub.bytes_in_buffer -= (size_t) num_bytes;
}
}
METHODDEF(void) term_source (j_decompress_ptr cinfo) { }
GLOBAL(void) jpeg_buf_src ( j_decompress_ptr cinfo, char * inbuf,int bufsize )
{
my_src_ptr src;
if (cinfo->src == NULL) cinfo->src=malloc( sizeof( my_source_mgr ) );
src = (my_src_ptr) cinfo->src;
src->pub.init_source = init_source;
src->pub.fill_input_buffer = fill_input_buffer;
src->pub.skip_input_data = skip_input_data;
src->pub.resync_to_restart = jpeg_resync_to_restart;
src->pub.term_source = term_source;
src->inbuf = inbuf;
src->bufsize=bufsize;
src->pub.bytes_in_buffer = 0;
src->pub.next_input_byte = NULL;
}
struct my_error_mgr
{
struct jpeg_error_mgr pub;
jmp_buf setjmp_buffer;
};
typedef struct my_error_mgr * my_error_ptr;
METHODDEF(void) my_error_exit (j_common_ptr cinfo)
{
my_error_ptr myerr=(my_error_ptr) cinfo->err;
(*cinfo->err->output_message) (cinfo);
longjmp(myerr->setjmp_buffer, 1);
}
static struct jpeg_decompress_struct cinfo;
static struct my_error_mgr jerr;
static int row_stride;
static int count;
// decode a frame
static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
mp_image_t * mpi = NULL;
int width,height,depth,i,j;
if ( len <= 0 ) return NULL; // skipped frame
cinfo.err=jpeg_std_error( &jerr.pub );
jerr.pub.error_exit=my_error_exit;
if( setjmp( jerr.setjmp_buffer ) )
{
mp_msg( MSGT_DECVIDEO,MSGL_ERR,"[ijpg] setjmp error ...\n" );
return NULL;
}
jpeg_create_decompress( &cinfo );
jpeg_buf_src( &cinfo,data,len );
jpeg_read_header( &cinfo,TRUE );
width=cinfo.image_width;
height=cinfo.image_height;
jpeg_start_decompress( &cinfo );
depth=cinfo.output_components * 8;
switch( depth ) {
case 8: out_fmt=IMGFMT_BGR8; break;
case 24: out_fmt=IMGFMT_BGR24; break;
default: mp_msg( MSGT_DECVIDEO,MSGL_ERR,"Sorry, unsupported JPEG colorspace: %d.\n",depth ); return NULL;
}
if ( last_w!=width || last_h!=height || last_c!=out_fmt )
{
last_w=width; last_h=height; last_c=out_fmt;
if ( !out_fmt ) return NULL;
mpcodecs_config_vo( sh,width,height,out_fmt );
}
mpi=mpcodecs_get_image( sh,MP_IMGTYPE_TEMP,MP_IMGFLAG_ACCEPT_STRIDE,width,height );
if ( !mpi ) return NULL;
row_stride=cinfo.output_width * cinfo.output_components;
for ( i=0;i < height;i++ )
{
char * row = mpi->planes[0] + mpi->stride[0] * i;
jpeg_read_scanlines( &cinfo,&row,1 );
#warning workaround for rgb2bgr
if ( depth == 24 )
for ( j=0;j < width * 3;j+=3 )
{
char c;
c=row[j];
row[j]=row[j+2];
row[j+2]=c;
}
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
return mpi;
}

View File

@ -94,7 +94,7 @@ demuxer_t* demux_open_mf(demuxer_t* demuxer){
sh_video->ds = demuxer->video;
if ( !strcasecmp( mf_type,"jpg" ) ||
!(strcasecmp(mf_type, "jpeg"))) sh_video->format = mmioFOURCC('M', 'J', 'P', 'G');
!(strcasecmp(mf_type, "jpeg"))) sh_video->format = mmioFOURCC('I', '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; }