changeset 1248:3f7f48067d3b

optional libavcodec (ffmpeg) support
author arpi
date Sat, 30 Jun 2001 00:16:39 +0000
parents 429aacbe23a7
children 07c2703b9b44
files codec-cfg.c mplayer.c
diffstat 2 files changed, 65 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/codec-cfg.c	Fri Jun 29 22:46:21 2001 +0000
+++ b/codec-cfg.c	Sat Jun 30 00:16:39 2001 +0000
@@ -207,6 +207,7 @@
 		"vfw",
 		"odivx",
 		"dshow",
+		"ffmpeg",
 		NULL
 	};
         char **drv=audioflag?audiodrv:videodrv;
--- a/mplayer.c	Fri Jun 29 22:46:21 2001 +0000
+++ b/mplayer.c	Sat Jun 30 00:16:39 2001 +0000
@@ -65,6 +65,13 @@
 #include "DirectShow/DS_AudioDec.h"
 #endif
 
+#ifdef USE_LIBAVCODEC
+#include "libavcodec/avcodec.h"
+    AVCodec *lavc_codec=NULL;
+    AVCodecContext lavc_context;
+    AVPicture lavc_picture;
+#endif
+
 #include "opendivx/decore.h"
 
 
@@ -1279,6 +1286,34 @@
    if(verbose) printf("INFO: OpenDivX video codec init OK!\n");
    break;
  }
+ case 5: {  // FFmpeg's libavcodec
+#ifndef USE_LIBAVCODEC
+   fprintf(stderr,"MPlayer was compiled WITHOUT libavcodec support!\n");
+   exit(1);
+#else
+   if(verbose) printf("FFmpeg's libavcodec video codec\n");
+    avcodec_init();
+    avcodec_register_all();
+    lavc_codec = avcodec_find_decoder_by_name(sh_video->codec->dll);
+    if(!lavc_codec){
+	fprintf(stderr,"Can't find codec '%s' in libavcodec...\n",sh_video->codec->dll);
+	exit(1);
+    }
+    memset(&lavc_context, 0, sizeof(lavc_context));
+    lavc_context.width=sh_video->disp_w;
+    lavc_context.height=sh_video->disp_h;
+    printf("libavcodec.size: %d x %d\n",lavc_context.width,lavc_context.height);
+    /* open it */
+    if (avcodec_open(&lavc_context, lavc_codec) < 0) {
+        fprintf(stderr, "could not open codec\n");
+        exit(1);
+    }
+   
+   if(verbose) printf("INFO: libavcodec init OK!\n");
+   break;
+#endif
+ }
+
  case 1: {
    // init libmpeg2:
 #ifdef MPEG12_POSTPROC
@@ -1712,6 +1747,35 @@
     break;
   }
 #endif
+#ifdef USE_LIBAVCODEC
+  case 5: {        // libavcodec
+    unsigned char* start=NULL;
+    unsigned int t=GetTimer();
+    unsigned int t2;
+    int got_picture=0;
+    int in_size=ds_get_packet(d_video,&start);
+    if(in_size<0){ eof=1;break;}
+    if(in_size>max_framesize) max_framesize=in_size;
+
+    if(d_video->flags) if(verbose) printf("***keyframe***\n");
+
+    if(drop_frame<2){
+        int ret = avcodec_decode_video(&lavc_context, &lavc_picture,
+	     &got_picture, start, in_size);
+	if(ret<0) fprintf(stderr, "Error while decoding frame!\n");
+    }
+
+    current_module="draw_frame";
+
+    if(!drop_frame && got_picture){
+      t2=GetTimer();t=t2-t;video_time_usage+=t*0.000001f;
+      video_out->draw_slice(lavc_picture.data,lavc_picture.linesize,sh_video->disp_w,sh_video->disp_h,0,0);
+      t2=GetTimer()-t2;vout_time_usage+=t2*0.000001f;
+    }
+    
+    break;
+  }
+#endif
   case 2: {
     HRESULT ret;
     unsigned char* start=NULL;