summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-07-19 22:43:19 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-07-19 22:43:19 +0000
commitb9e207fab3d5c8350c4f1fc90dbc15a2a86491fe (patch)
treed9dd19df85bc34fde12bd2319946b1b2fb3ef6c6
parent0555198655c5ec8bdce911407163c042f88c27dd (diff)
downloadmpv-b9e207fab3d5c8350c4f1fc90dbc15a2a86491fe.tar.bz2
mpv-b9e207fab3d5c8350c4f1fc90dbc15a2a86491fe.tar.xz
DivX4Linux support
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1350 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--DOCS/codecs.conf18
-rw-r--r--Makefile2
-rw-r--r--codec-cfg.c1
-rwxr-xr-xconfigure6
-rw-r--r--dec_video.c92
5 files changed, 103 insertions, 16 deletions
diff --git a/DOCS/codecs.conf b/DOCS/codecs.conf
index b2d6bb078e..617da133ee 100644
--- a/DOCS/codecs.conf
+++ b/DOCS/codecs.conf
@@ -81,6 +81,23 @@ videocodec divx
dll "divxc32.dll"
out YUY2 yuvhack
out BGR32,BGR24,BGR15
+
+videocodec divx4
+ info "DivX4Linux (MPEG-4 v2,v3)"
+ comment "with postprocessing"
+ status working
+ fourcc DIVX,divx
+ fourcc DIV1,div1 divx
+ fourcc MP4S,mp4s ; ISO MPEG-4 Video V1
+ fourcc MP43,mp43,DIV3,div3,DIV4,div4 DIV3 ; for DivX4Linux only!
+ format 0x4
+ driver divx4
+ dll "libdivxdecore.0"
+; out YV12 ; works, but odivx driver is faster with YV12 (DEC_USER)
+ out I420
+ out YUY2
+ out UYVY
+ out BGR32,BGR24,BGR16,BGR15
videocodec odivx
info "OpenDivX (MPEG-4 v2)"
@@ -89,6 +106,7 @@ videocodec odivx
fourcc DIVX,divx
fourcc DIV1,div1 divx
fourcc MP4S,mp4s ; ISO MPEG-4 Video V1
+ fourcc MP43,mp43,DIV3,div3,DIV4,div4 DIV3 ; for DivX4Linux only!
format 0x4
driver odivx
dll "opendivx decore"
diff --git a/Makefile b/Makefile
index 9acf09045c..ece715bd30 100644
--- a/Makefile
+++ b/Makefile
@@ -81,7 +81,7 @@ mplayerwithoutlink: $(MPLAYER_DEP)
@for a in mp3lib libac3 libmpeg2 libvo opendivx libavcodec encore loader/DirectShow ; do $(MAKE) -C $$a all ; done
$(PRG): $(MPLAYER_DEP)
- $(CC) $(CFLAGS) -o $(PRG) mplayer.o $(OBJS) $(XMM_LIBS) $(LIRC_LIBS) $(A_LIBS) -lm $(TERMCAP_LIB) $(LIB_LOADER) $(AV_LIB) -Llibmpeg2 -lmpeg2 -Lopendivx -ldecore -Llibao2 -lao2 $(VO_LIBS) $(CSS_LIB) -Lencore -lencore $(ARCH_LIBS)
+ $(CC) $(CFLAGS) -o $(PRG) mplayer.o $(OBJS) $(XMM_LIBS) $(LIRC_LIBS) $(A_LIBS) -lm $(TERMCAP_LIB) $(LIB_LOADER) $(AV_LIB) -Llibmpeg2 -lmpeg2 -Llibao2 -lao2 $(VO_LIBS) $(CSS_LIB) -Lencore -lencore $(DECORE_LIBS) $(ARCH_LIBS)
$(PRG_FIBMAP): fibmap_mplayer.o
$(CC) -o $(PRG_FIBMAP) fibmap_mplayer.o
diff --git a/codec-cfg.c b/codec-cfg.c
index a2723c0614..014043eafe 100644
--- a/codec-cfg.c
+++ b/codec-cfg.c
@@ -214,6 +214,7 @@ static short get_driver(char *s,int audioflag)
"dshow",
"ffmpeg",
"vfwex",
+ "divx4",
NULL
};
char **drv=audioflag?audiodrv:videodrv;
diff --git a/configure b/configure
index 1a0e87825e..850ec83e4d 100755
--- a/configure
+++ b/configure
@@ -1703,6 +1703,8 @@ ALSA_LIB = $_alsalib
ESD_LIB = $_esdlib
ARCH_LIBS = $_archlibs
STREAM_SRCS = $_streamingsrcs
+DECORE_LIBS = -Lopendivx -ldecore
+# DECORE_LIBS=-L/usr/local/lib -ldivxdecore
# --- Some stuff for autoconfigure ----
$_target_arch
@@ -1720,6 +1722,10 @@ cat > $CCONF << EOF
/* -------- Generated by ./configure ----------- */
+/* Define for using new DivX4Linux library, instead of open-source OpenDivX */
+/* You have to change DECORE_LIBS in config.mak too! */
+#undef NEW_DECORE
+
/* Define this to enable avg. byte/sec-based AVI sync method by default:
(use -bps or -nobps commandline option for run-time method selection) */
#undef AVI_SYNC_BPS
diff --git a/dec_video.c b/dec_video.c
index 6632422993..c781c83ad2 100644
--- a/dec_video.c
+++ b/dec_video.c
@@ -45,7 +45,11 @@ extern int init_video_codec(sh_video_t *sh_video,int ex);
AVPicture lavc_picture;
#endif
+#ifndef NEW_DECORE
#include "opendivx/decore.h"
+#else
+#include <decore.h>
+#endif
//**************************************************************************//
// The OpenDivX stuff:
@@ -156,29 +160,47 @@ switch(sh_video->codec->driver){
if(verbose) printf("OpenDivX video codec\n");
{ DEC_PARAM dec_param;
DEC_SET dec_set;
+ memset(&dec_param,0,sizeof(dec_param));
#ifdef NEW_DECORE
- DEC_MEM_REQS dec_mem;
dec_param.output_format=DEC_USER;
#else
dec_param.color_depth = 32;
#endif
dec_param.x_dim = sh_video->bih->biWidth;
dec_param.y_dim = sh_video->bih->biHeight;
-#ifdef NEW_DECORE
- // 0.50-CVS new malloc scheme
- decore(0x123, DEC_OPT_MEMORY_REQS, &dec_param, &dec_mem);
- dec_param.buffers.mp4_edged_ref_buffers=malloc(dec_mem.mp4_edged_ref_buffers_size);
- dec_param.buffers.mp4_edged_for_buffers=malloc(dec_mem.mp4_edged_for_buffers_size);
- dec_param.buffers.mp4_display_buffers=malloc(dec_mem.mp4_display_buffers_size);
- dec_param.buffers.mp4_state=malloc(dec_mem.mp4_state_size);
- dec_param.buffers.mp4_tables=malloc(dec_mem.mp4_tables_size);
- dec_param.buffers.mp4_stream=malloc(dec_mem.mp4_stream_size);
-#endif
decore(0x123, DEC_OPT_INIT, &dec_param, NULL);
-
dec_set.postproc_level = divx_quality;
decore(0x123, DEC_OPT_SETPP, &dec_set, NULL);
-
+ }
+ if(verbose) printf("INFO: OpenDivX video codec init OK!\n");
+ break;
+ }
+ case 7: { // DivX4Linux
+ if(verbose) printf("DivX4Linux video codec\n");
+ { DEC_PARAM dec_param;
+ DEC_SET dec_set;
+ int bits=16;
+ memset(&dec_param,0,sizeof(dec_param));
+ switch(out_fmt){
+ case IMGFMT_YV12: dec_param.output_format=DEC_YV12;bits=12;break;
+ case IMGFMT_YUY2: dec_param.output_format=DEC_YUY2;break;
+ case IMGFMT_UYVY: dec_param.output_format=DEC_UYVY;break;
+ case IMGFMT_I420: dec_param.output_format=DEC_420;bits=12;break;
+ case IMGFMT_BGR15: dec_param.output_format=DEC_RGB555_INV;break;
+ case IMGFMT_BGR16: dec_param.output_format=DEC_RGB565_INV;break;
+ case IMGFMT_BGR24: dec_param.output_format=DEC_RGB24_INV;bits=24;break;
+ case IMGFMT_BGR32: dec_param.output_format=DEC_RGB32_INV;bits=32;break;
+ default:
+ fprintf(stderr,"Unsupported out_fmt: 0x%X\n",out_fmt);
+ return 0;
+ }
+ dec_param.x_dim = sh_video->bih->biWidth;
+ dec_param.y_dim = sh_video->bih->biHeight;
+ decore(0x123, DEC_OPT_INIT, &dec_param, NULL);
+ dec_set.postproc_level = divx_quality;
+ decore(0x123, DEC_OPT_SETPP, &dec_set, NULL);
+// sh_video->our_out_buffer = shmem_alloc(((bits*dec_param.x_dim+7)/8)*dec_param.y_dim);
+ sh_video->our_out_buffer = shmem_alloc(dec_param.x_dim*dec_param.y_dim*5);
}
if(verbose) printf("INFO: OpenDivX video codec init OK!\n");
break;
@@ -247,14 +269,19 @@ switch(sh_video->codec->driver){
// let's decode
dec_frame.length = in_size;
dec_frame.bitstream = start;
- dec_frame.render_flag = 1;
+ dec_frame.render_flag = drop_frame?0:1;
+
#ifdef NEW_DECORE
dec_frame.bmp=&dec_pic;
dec_pic.y=dec_pic.u=dec_pic.v=NULL;
-#endif
+ decore(0x123, (sh_video->format==mmioFOURCC('D','I','V','3'))?DEC_OPT_FRAME_311:DEC_OPT_FRAME, &dec_frame, NULL);
+#else
decore(0x123, 0, &dec_frame, NULL);
+#endif
+
t2=GetTimer();t=t2-t;video_time_usage+=t*0.000001f;
+ // let's display
#ifdef NEW_DECORE
if(dec_pic.y){
void* src[3];
@@ -280,6 +307,41 @@ switch(sh_video->codec->driver){
break;
}
+ case 7: {
+ // DivX4Linux
+ unsigned int t=GetTimer();
+ unsigned int t2;
+ DEC_FRAME dec_frame;
+ // let's decode
+ dec_frame.length = in_size;
+ dec_frame.bitstream = start;
+ dec_frame.render_flag = drop_frame?0:1;
+ dec_frame.bmp=sh_video->our_out_buffer;
+ dec_frame.stride=sh_video->disp_w;
+// printf("Decoding DivX4 frame\n");
+ decore(0x123, (sh_video->format==mmioFOURCC('D','I','V','3'))?DEC_OPT_FRAME_311:DEC_OPT_FRAME, &dec_frame, NULL);
+ t2=GetTimer();t=t2-t;video_time_usage+=t*0.000001f;
+
+ if(!drop_frame && sh_video->our_out_buffer){
+// printf("Displaying DivX4 frame\n");
+ if(out_fmt==IMGFMT_YV12||out_fmt==IMGFMT_IYUV||out_fmt==IMGFMT_I420){
+ uint8_t* dst[3];
+ int stride[3];
+ stride[0]=sh_video->disp_w;
+ stride[1]=stride[2]=sh_video->disp_w/2;
+ dst[0]=sh_video->our_out_buffer;
+ dst[2]=dst[0]+sh_video->disp_w*sh_video->disp_h;
+ dst[1]=dst[2]+sh_video->disp_w*sh_video->disp_h/4;
+ video_out->draw_slice(dst,stride,sh_video->disp_w,sh_video->disp_h,0,0);
+ } else
+ video_out->draw_frame((uint8_t **)&sh_video->our_out_buffer);
+ blit_frame=1;
+ }
+
+ t2=GetTimer()-t2;vout_time_usage+=t2*0.000001f;
+
+ break;
+ }
#ifdef USE_DIRECTSHOW
case 4: { // W32/DirectShow
unsigned int t=GetTimer();