changeset 3063:004e3199fee0

mplayer integration
author arpi
date Thu, 22 Nov 2001 03:16:31 +0000
parents 7ea7e5fce639
children 3c10aeb3f441
files loader/dshow/DS_AudioDecoder.c loader/dshow/DS_AudioDecoder.h loader/dshow/DS_VideoDecoder.c loader/dshow/DS_VideoDecoder.h loader/dshow/Makefile loader/dshow/libwin32.h
diffstat 6 files changed, 226 insertions(+), 252 deletions(-) [+]
line wrap: on
line diff
--- a/loader/dshow/DS_AudioDecoder.c	Thu Nov 22 03:15:49 2001 +0000
+++ b/loader/dshow/DS_AudioDecoder.c	Thu Nov 22 03:16:31 2001 +0000
@@ -75,13 +75,13 @@
     /*try*/
     {
         ALLOCATOR_PROPERTIES props, props1;
-        this->m_pDS_Filter = DS_Filter_Create((const char*)info->dll, &info->guid, &this->m_sOurType, &this->m_sDestType);
+        this->m_pDS_Filter = DS_FilterCreate((const char*)info->dll, info->guid, &this->m_sOurType, &this->m_sDestType);
 	if( !this->m_pDS_Filter ) {
            free(this);
            return NULL;
         }
         
-        DS_Filter_Start(this->m_pDS_Filter);
+        this->m_pDS_Filter->Start(this->m_pDS_Filter);
 
 	props.cBuffers=1;
         props.cbBuffer=this->m_sOurType.lSampleSize;
@@ -130,8 +130,8 @@
 	int result;
 	
 //	this->m_pOurOutput->SetFramePointer(out_data+written);
-	COutputPin_SetFramePointer(this->m_pDS_Filter->m_pOurOutput,&frame_pointer);
-	COutputPin_SetFrameSizePointer(this->m_pDS_Filter->m_pOurOutput,(long*)&frame_size);
+	this->m_pDS_Filter->m_pOurOutput->SetFramePointer(this->m_pDS_Filter->m_pOurOutput,&frame_pointer);
+	this->m_pDS_Filter->m_pOurOutput->SetFrameSizePointer(this->m_pDS_Filter->m_pOurOutput,(long*)&frame_size);
 	this->m_pDS_Filter->m_pAll->vt->GetBuffer(this->m_pDS_Filter->m_pAll, &sample, 0, 0, 0);
 	if (!sample)
 	{
--- a/loader/dshow/DS_AudioDecoder.h	Thu Nov 22 03:15:49 2001 +0000
+++ b/loader/dshow/DS_AudioDecoder.h	Thu Nov 22 03:16:31 2001 +0000
@@ -5,7 +5,7 @@
 #include "audiodecoder.h"
 #include "except.h"
 #else
-#include "../libwin32.h"
+#include "libwin32.h"
 #endif
 #include "DS_Filter.h"
 
--- a/loader/dshow/DS_VideoDecoder.c	Thu Nov 22 03:15:49 2001 +0000
+++ b/loader/dshow/DS_VideoDecoder.c	Thu Nov 22 03:16:31 2001 +0000
@@ -70,6 +70,8 @@
     this->m_iLastQuality = -1;
     this->m_iMaxAuto = maxauto;
 
+    Setup_LDT_Keeper();
+
     //memset(&m_obh, 0, sizeof(m_obh));
     //m_obh.biSize = sizeof(m_obh);
     /*try*/
@@ -140,7 +142,7 @@
                               * ((this->iv.m_obh.biBitCount + 7) / 8);
 
 
-	this->m_pDS_Filter = DS_Filter_Create((const char*)info->dll, &info->guid, &this->m_sOurType, &this->m_sDestType);
+	this->m_pDS_Filter = DS_FilterCreate((const char*)info->dll, info->guid, &this->m_sOurType, &this->m_sDestType);
 
 	if (!flip)
 	{
@@ -230,7 +232,7 @@
     ALLOCATOR_PROPERTIES props, props1;
     Debug printf("DS_VideoDecoder_StartInternal\n");
     //cout << "DSSTART" << endl;
-    DS_Filter_Start(this->m_pDS_Filter);
+    this->m_pDS_Filter->Start(this->m_pDS_Filter);
     
     props.cBuffers = 1;
     props.cbBuffer = this->m_sDestType.lSampleSize;
@@ -245,17 +247,17 @@
 
 void DS_VideoDecoder_StopInternal(DS_VideoDecoder *this)
 {
-    DS_Filter_Stop(this->m_pDS_Filter);
+    this->m_pDS_Filter->Stop(this->m_pDS_Filter);
     //??? why was this here ??? m_pOurOutput->SetFramePointer(0);
 }
 
-int DS_VideoDecoder_DecodeInternal(DS_VideoDecoder *this, const void* src, int size, int is_keyframe, CImage* pImage)
+int DS_VideoDecoder_DecodeInternal(DS_VideoDecoder *this, const void* src, int size, int is_keyframe, char* pImage)
 {
     IMediaSample* sample = 0;
     char* ptr;
     int result;
     
-    Debug printf("DS_VideoDecoder_DecodeInternal(%p,%p,%d,%d,%p)\n",this,src,size,is_keyframe,pImage->ptr);
+    Debug printf("DS_VideoDecoder_DecodeInternal(%p,%p,%d,%d,%p)\n",this,src,size,is_keyframe,pImage);
             
     this->m_pDS_Filter->m_pAll->vt->GetBuffer(this->m_pDS_Filter->m_pAll, &sample, 0, 0, 0);
     
@@ -268,12 +270,7 @@
     //cout << "DECODE " << (void*) pImage << "   d: " << (void*) pImage->Data() << endl;
     if (pImage)
     {
-	if (!(pImage->ptr))
-	{
-	    Debug printf("no m_outFrame??\n");
-	}
-	else
-	    COutputPin_SetPointer2(this->m_pDS_Filter->m_pOurOutput,(char*)pImage->ptr);
+	this->m_pDS_Filter->m_pOurOutput->SetPointer2(this->m_pDS_Filter->m_pOurOutput,pImage);
     }
 
 
@@ -390,7 +387,7 @@
 */
     // BitmapInfo temp = m_obh;
     
-    if (bits != 0)
+    if (!csp)	// RGB
     {
 	int ok = true;
 
@@ -438,10 +435,8 @@
             }
         }
 	//.biSizeImage=abs(temp.biWidth*temp.biHeight*((temp.biBitCount+7)/8));
-    }
-
-    if (csp != 0)
-    {
+    } else
+    {	// YUV
         int ok = true;
 	switch (csp)
 	{
@@ -466,19 +461,6 @@
 	}
 
         if (ok) {
-          int bits=0;
-	  switch(csp){
-	  case fccYUV:
-	    bits=24;break;
-	  case fccYUY2:
-	  case fccUYVY:
-	  case fccYVYU:
-	    bits=16;break;
-	  case fccYV12:
-	  case fccIYUV:
-	  case fccI420:
-	    bits=12;break;
-	  }
 	  if (csp != 0 && csp != 3 && this->iv.m_obh.biHeight > 0)
     	    this->iv.m_obh.biHeight *= -1; // YUV formats uses should have height < 0
 	  this->iv.m_obh.biSize = sizeof(BITMAPINFOHEADER);
@@ -561,7 +543,7 @@
 
     this->m_pDS_Filter->m_pInputPin->vt->Disconnect(this->m_pDS_Filter->m_pInputPin);
     this->m_pDS_Filter->m_pOutputPin->vt->Disconnect(this->m_pDS_Filter->m_pOutputPin);
-    COutputPin_SetNewFormat(this->m_pDS_Filter->m_pOurOutput,&this->m_sDestType);
+    this->m_pDS_Filter->m_pOurOutput->SetNewFormat(this->m_pDS_Filter->m_pOurOutput,&this->m_sDestType);
     result = this->m_pDS_Filter->m_pInputPin->vt->ReceiveConnection(this->m_pDS_Filter->m_pInputPin,
 							      this->m_pDS_Filter->m_pOurInput,
 							      &this->m_sOurType);
@@ -811,5 +793,64 @@
     return 0;
 }
 /*
-vim: tabstop=8
+vim: vi* sux.
 */
+
+int DS_SetAttr_DivX(char* attribute, int value){
+    int result, status, newkey, count;
+        if(strcmp(attribute, "Quality")==0){
+	    char* keyname="SOFTWARE\\Microsoft\\Scrunch";
+    	    result=RegCreateKeyExA(HKEY_CURRENT_USER, keyname, 0, 0, 0, 0, 0,	   		&newkey, &status);
+            if(result!=0)
+	    {
+	        printf("VideoDecoder::SetExtAttr: registry failure\n");
+	        return -1;
+	    }    
+	    result=RegSetValueExA(newkey, "Current Post Process Mode", 0, REG_DWORD, &value, 4);
+            if(result!=0)
+	    {
+	        printf("VideoDecoder::SetExtAttr: error writing value\n");
+	        return -1;
+	    }    
+	    value=-1;
+	    result=RegSetValueExA(newkey, "Force Post Process Mode", 0, REG_DWORD, &value, 4);
+            if(result!=0)
+	    {
+		printf("VideoDecoder::SetExtAttr: error writing value\n");
+	    	return -1;
+	    }    
+   	    RegCloseKey(newkey);
+   	    return 0;
+	}   	
+
+        if(
+	(strcmp(attribute, "Saturation")==0) ||
+	(strcmp(attribute, "Hue")==0) ||
+	(strcmp(attribute, "Contrast")==0) ||
+	(strcmp(attribute, "Brightness")==0)
+	)
+        {
+	    char* keyname="SOFTWARE\\Microsoft\\Scrunch\\Video";
+    	    result=RegCreateKeyExA(HKEY_CURRENT_USER, keyname, 0, 0, 0, 0, 0,	   		&newkey, &status);
+            if(result!=0)
+	    {
+	        printf("VideoDecoder::SetExtAttr: registry failure\n");
+	        return -1;
+	    }    
+	    result=RegSetValueExA(newkey, attribute, 0, REG_DWORD, &value, 4);
+            if(result!=0)
+	    {
+	        printf("VideoDecoder::SetExtAttr: error writing value\n");
+	        return -1;
+	    }    
+   	    RegCloseKey(newkey);
+   	    return 0;
+	}   	
+
+        printf("Unknown attribute!\n");
+        return -200;
+}
+
+
+
+
--- a/loader/dshow/DS_VideoDecoder.h	Thu Nov 22 03:15:49 2001 +0000
+++ b/loader/dshow/DS_VideoDecoder.h	Thu Nov 22 03:16:31 2001 +0000
@@ -4,7 +4,7 @@
 #ifndef NOAVIFILE_HEADERS
 #include "videodecoder.h"
 #else
-#include "../libwin32.h"
+#include "libwin32.h"
 #endif
 #include "DS_Filter.h"
 
@@ -36,7 +36,7 @@
 
 void DS_VideoDecoder_StopInternal(DS_VideoDecoder *this);
 
-int DS_VideoDecoder_DecodeInternal(DS_VideoDecoder *this, const void* src, int size, int is_keyframe, CImage* pImage);
+int DS_VideoDecoder_DecodeInternal(DS_VideoDecoder *this, const void* src, int size, int is_keyframe, char* pImage);
 
 /*
  * bits == 0   - leave unchanged
--- a/loader/dshow/Makefile	Thu Nov 22 03:15:49 2001 +0000
+++ b/loader/dshow/Makefile	Thu Nov 22 03:16:31 2001 +0000
@@ -3,20 +3,20 @@
 
 include ../../config.mak
 
-# DS_AudioDec.cpp 
-SRCS	= DS_AudioDec.cpp DS_AudioDecoder.cpp DS_VideoDec.cpp DS_Filter.cpp DS_VideoDecoder.cpp allocator.cpp cmediasample.cpp guids.cpp inputpin.cpp outputpin.cpp
-OBJS = $(SRCS:.cpp=.o)
+# DS_AudioDec.c 
+SRCS	= DS_AudioDecoder.c DS_Filter.c DS_VideoDecoder.c allocator.c cmediasample.c guids.c inputpin.c outputpin.c
+OBJS = $(SRCS:.c=.o)
 
 # OBJS	= DS_AudioDec.o DS_VideoDec.o DS_Filter.o allocator.o cmediasample.o guids.o inputpin.o outputpin.o
 
 INCLUDE = -I. -I.. $(EXTRA_INC) -DNOAVIFILE_HEADERS
-CFLAGS  = $(OPTFLAGS) $(INCLUDE) -fexceptions 
+CFLAGS  = $(OPTFLAGS) $(INCLUDE)
 
-.SUFFIXES: .cpp .o
+.SUFFIXES: .c .o
 
 # .PHONY: all clean
 
-.cpp.o:
+.c.o:
 	$(CC) -c $(CFLAGS) -o $@ $<
 
 $(LIBNAME):	$(OBJS)
--- a/loader/dshow/libwin32.h	Thu Nov 22 03:15:49 2001 +0000
+++ b/loader/dshow/libwin32.h	Thu Nov 22 03:16:31 2001 +0000
@@ -1,72 +1,161 @@
 #ifndef __LIBWIN32_H
 #define __LIBWIN32_H
 
-#define VFW_E_INVALIDMEDIATYPE  	0x80040200
-#define VFW_E_INVALIDSUBTYPE    	0x80040201
-#define VFW_E_ALREADY_CONNECTED         0x80040204
-#define VFW_E_FILTER_ACTIVE             0x80040205
-#define VFW_E_NO_ACCEPTABLE_TYPES       0x80040207
-#define VFW_E_NOT_CONNECTED             0x80040209
-#define VFW_E_NO_ALLOCATOR              0x8004020A
-#define VFW_E_NOT_RUNNING               0x80040226
-#define VFW_E_TYPE_NOT_ACCEPTED         0x8004022A
-#define VFW_E_SAMPLE_REJECTED           0x8004022B
+#ifndef NOAVIFILE_HEADERS
+#error this header file should not be used without -DNOAVIFILE_HEADERS
+#endif
 
-#include <sys/types.h>
-#include <inttypes.h>
+// this file is only included when NOAVIFILE_HEADERS are defined
+// serves mainly for mplayer
 
-#ifndef NOAVIFILE_HEADERS
-#include <audiodecoder.h>
-#include <audioencoder.h>
-#include <videodecoder.h>
-#include <videoencoder.h>
-#include <except.h>
-#include <fourcc.h>
+#define VFW_E_NOT_RUNNING               0x80040226
 
-#else
-// code for mplayer team
+#include <inttypes.h>
 
 //#define FATAL(a)  // you don't need exception - if you want - just fill more code
-#define FATAL(X...) FatalError(__MODULE__,__FILE__,__LINE__,X)
-#include <wine/mmreg.h>
-#include <wine/winreg.h>
-#include <wine/vfw.h>
-#include <com.h>
-#include <stdarg.h>
-//#include <string>
-#include <stdio.h>
-#include <stdlib.h>
+#include "wine/mmreg.h"
+#include "wine/winreg.h"
+#include "wine/vfw.h"
+#include "com.h"
+
+typedef uint32_t fourcc_t;
+
+/*
+typedef struct _FatalError
+{
+    FatalError();
+    void PrintAll() {}
+}FatalError;
+*/
+
+typedef struct _CodecInfo
+{
+    char* dll;
+    GUID* guid;
+}CodecInfo;
+
 
-typedef unsigned int uint_t;    // use as generic type -
+typedef struct _CImage // public  your_libvo_mem
+{
+    char* ptr;
+    
+    /*char* (*Data)();
+    {
+	return 0;
+	// pointer to memory block
+    }*/
+    /*int (*Supported)(fourcc_t csp, int bits);
+    {
+	return true;
+	// if you support such surface 
+    }*/
+}CImage;
 
-typedef unsigned int fourcc_t;
 
-struct FatalError
+#if 0
+struct BitmapInfo : public BITMAPINFOHEADER
+{
+    void SetBits(int b) { return; /*fixme*/ }
+    void SetSpace(int b) { return; /*fixme*/ }
+};
+#endif
+
+typedef struct _IAudioDecoder
 {
-    FatalError(const char* mod, const char* f, int l, const char* desc,...)
+    WAVEFORMATEX in_fmt;
+    CodecInfo  record;
+    /*(*IAudioDecoder)( CodecInfo * r, const WAVEFORMATEX* w);
+    {
+        memcpy(&this->record,r,sizeof(CodecInfo));
+        in_fmt = *w;
+    }*/
+}IAudioDecoder;
+
+/*
+struct IAudioEncoder
+{
+    IAudioEncoder(const CodecInfo&, WAVEFORMATEX*) {}
+    // you do not need this one...
+};
+*/
+
+    enum CAPS
     {
-	printf("FATAL: module: %s  source: %s line %d ", mod, f, l);
-	va_list va;
-	va_start(va, desc);
-	vprintf(desc, va);
-	va_end(va);
-    }
-    void PrintAll() {}
-};
+	CAP_NONE = 0,
+	CAP_YUY2 = 1,
+	CAP_YV12 = 2,
+	CAP_IYUV = 4,
+	CAP_UYVY = 8,
+	CAP_YVYU = 16,
+	CAP_I420 = 32,
+    };
+    enum DecodingMode
+    {
+	DIRECT = 0,
+	REALTIME,
+	REALTIME_QUALITY_AUTO,
+    };
+    enum DecodingState
+    {
+	STOP = 0,
+	START,
+    };
 
-struct CodecInfo
+typedef struct _BitmapInfo
+{
+    long 	biSize;
+    long  	biWidth;
+    long  	biHeight;
+    short 	biPlanes;
+    short 	biBitCount;
+    long 	biCompression;
+    long 	biSizeImage;
+    long  	biXPelsPerMeter;
+    long  	biYPelsPerMeter;
+    long 	biClrUsed;
+    long 	biClrImportant;
+    int 	colors[3];    
+} BitmapInfo;
+
+typedef struct _IVideoDecoder
 {
-//    std::string dll;
-    char* dll;
-    GUID guid;
-};
+    int VBUFSIZE;
+    int QMARKHI;
+    int QMARKLO;
+    int DMARKHI;
+    int DMARKLO;
 
-struct CImage { // public  your_libvo_mem
-    char* ptr;
-    char* Data() { return ptr; }  // pointer to memory block
-	/* if you support such surface: */
-    static bool Supported(fourcc_t csp, int bits) { return true; }
+    /*
+    IVideoDecoder(CodecInfo& info, const BITMAPINFOHEADER& format) : record(info)
+    {
+        // implement init part
+    }
+    virtual ~IVideoDecoder();
+    void Stop()
+    {
+    }
+    void Start()
+    {
+    }
+    */
+    const CodecInfo record;
+    int m_Mode;	// should we do precaching (or even change Quality on the fly)
+    int m_State;
+    int m_iDecpos;
+    int m_iPlaypos;
+    float m_fQuality;           // quality for the progress bar 0..1(best)
+    int m_bCapable16b;
+
+    BITMAPINFOHEADER* m_bh;	// format of input data (might be larger - e.g. huffyuv)
+    BitmapInfo m_decoder;	// format of decoder output
+    BitmapInfo m_obh;		// format of returned frames
+}IVideoDecoder;
+
+/*
+struct IRtConfig
+{
 };
+*/
 
 // might be minimalized to contain just those which are needed by DS_VideoDecoder
 
@@ -167,160 +256,4 @@
 #define fccUYVY mmioFOURCC('U', 'Y', 'V', 'Y')/* Packed mode: U0+Y0+V0+Y1 (1 plane) */
 #define fccYVYU mmioFOURCC('Y', 'V', 'Y', 'U')/* Packed mode: Y0+V0+Y1+U0 (1 plane) */
 
-
-struct BitmapInfo : public BITMAPINFOHEADER
-{
-    int colors[3];
-
-    void SetBitFields16(){	
-	biSize=sizeof(BITMAPINFOHEADER)+12;
-	biCompression=3;//BI_BITFIELDS
-	biBitCount=16;
-	biSizeImage=abs((int)(2*biWidth*biHeight));
-	colors[0]=0xF800;
-	colors[1]=0x07E0;
-	colors[2]=0x001F;
-    }	
-    void SetBitFields15(){	
-	biSize=sizeof(BITMAPINFOHEADER)+12;
-	biCompression=3;//BI_BITFIELDS
-	biBitCount=16;
-	biSizeImage=abs((int)(2*biWidth*biHeight));
-	colors[0]=0x7C00;
-	colors[1]=0x03E0;
-	colors[2]=0x001F;
-    }	
-    void SetRGB(){
-	biSize = sizeof(BITMAPINFOHEADER);
-	biCompression = 0;	//BI_RGB
-	//biHeight = labs(biHeight);
-	biSizeImage = labs(biWidth * biHeight) * ((biBitCount + 7) / 8);
-    }
-    void SetBits(int bits) { 
-        switch (bits){
-	    case 15: SetBitFields15();break;
-	    case 16: SetBitFields16();break;
-	    default: biBitCount = bits; SetRGB();break;
-        }
-    }
-    void SetSpace(int csp,int bits) {
-	biSize = sizeof(BITMAPINFOHEADER);
-	biCompression=csp;
-	biBitCount=bits;
-	biSizeImage=labs(biBitCount*biWidth*biHeight)>>3;
-    }
-    void SetSpace(int csp) {
-	int bits=0;
-	switch(csp){
-	case fccYUV:
-	    bits=24;break;
-	case fccYUY2:
-	case fccUYVY:
-	case fccYVYU:
-	    bits=16;break;
-	case fccYV12:
-	case fccIYUV:
-	case fccI420:
-	    bits=12;break;
-	}
-	if (csp != 0 && csp != 3 && biHeight > 0)
-    	    biHeight *= -1; // YUV formats uses should have height < 0
-	SetSpace(csp,bits);
-    }
-
-};
-
-struct IAudioDecoder
-{
-    WAVEFORMATEX in_fmt;
-    const CodecInfo& record;
-    IAudioDecoder(const CodecInfo& r, const WAVEFORMATEX* w) : record(r)
-    {
-        in_fmt = *w;
-    }
-};
-
-struct IAudioEncoder
-{
-    IAudioEncoder(const CodecInfo&, WAVEFORMATEX*) {}
-    // you do not need this one...
-};
-
-struct IVideoDecoder
-{
-    int VBUFSIZE;
-    int QMARKHI;
-    int QMARKLO;
-    int DMARKHI;
-    int DMARKLO;
-
-    enum CAPS
-    {
-	CAP_NONE = 0,
-	CAP_YUY2 = 1,
-	CAP_YV12 = 2,
-	CAP_IYUV = 4,
-	CAP_UYVY = 8,
-	CAP_YVYU = 16,
-	CAP_I420 = 32,
-    };
-    enum DecodingMode
-    {
-	DIRECT = 0,
-	REALTIME,
-	REALTIME_QUALITY_AUTO,
-    };
-    enum DecodingState
-    {
-	STOP = 0,
-	START,
-    };
-    IVideoDecoder(const CodecInfo& info, const BITMAPINFOHEADER& format) : record(info)
-    {
-        // implement init part
-     unsigned bihs = (format.biSize < (int) sizeof(BITMAPINFOHEADER)) ?
-	  sizeof(BITMAPINFOHEADER) : format.biSize;
-     m_bh = (BITMAPINFOHEADER*) new char[bihs];
-     memcpy(m_bh, &format, bihs);
-     m_State = STOP;
-     //m_pFrame = 0;
-     m_Mode = DIRECT;
-     m_iDecpos = 0;
-     m_iPlaypos = -1;
-     m_fQuality = 0.0f;
-     m_bCapable16b = true;
-
-    }
-    virtual ~IVideoDecoder(){};
-    // use this one
-    int Decode(void* src, size_t size, int is_keyframe, CImage* pImage)
-    { return DecodeInternal(src, size, is_keyframe, pImage); }
-    void Stop(){ StopInternal();  m_State = STOP;}
-    void Start(){StartInternal(); m_State = START;}
-    protected:
-    virtual int DecodeInternal(void* src, size_t size, int is_keyframe, CImage* pImage) = 0;
-    virtual void StartInternal()=0;
-    virtual void StopInternal()=0;
-
-    const CodecInfo& record;
-    DecodingMode m_Mode;	// should we do precaching (or even change Quality on the fly)
-    DecodingState m_State;
-    int m_iDecpos;
-    int m_iPlaypos;
-    float m_fQuality;           // quality for the progress bar 0..1(best)
-    bool m_bCapable16b;
-
-    BITMAPINFOHEADER* m_bh;	// format of input data (might be larger - e.g. huffyuv)
-    BitmapInfo m_decoder;	// format of decoder output
-    BitmapInfo m_obh;		// format of returned frames
-};
-
-struct IRtConfig
-{
-};
-
-
-
 #endif
-
-#endif