Seite 1 von 1

Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 21:31
von D3DX
Wäre jemand so freundlich mir folgenden code von pascal nach c++ zu übersetzen.
dieser enthält möglicherweise die lösung meines problems in sachen libvlc/dx9/c++
ich möchte mit libvlc v1.1.9 ein video auf eine directx9 textur rendern und der pascal-code scheint dieses zu machen.

hier ist der link
http://forum.videolan.org/viewtopic.php ... 18#p274498


Wäre wirklich sehr nett, wenn sich jemand hierfür zeit nehmen könnte,

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 22:37
von Aramis
Wenn du C++ kennst, kannst du das auch selber machen - selbst wenn du noch nie zuvor Pascal gesehen hast :-) Die relevanten Funktionen sind ja gleich benannt.

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 22:47
von joggel
Was war denn los?
In dem anderen Thread hasst Du doch die neue Version von LibVLC genommen, und das Problem war gelöst.

Gruß

[Edit]
Ich hatte mal Langeweile und wollte mal meine Pascal-"Kentnisse" benutzen.
Das ist dabei rausgekommen:
Header Datei ... Sorry, mir fiel kein besserer Name ein

Code: Alles auswählen

class VLC_ZFX
{
private:	
  const int video_width;
  const int video_height;
  TCriticalSection vlcMutex;
  std::vector<unsigned char> vlcBuffer;
  IDirect3DTexture9 vlcVideoTexture;
  IDirect3DTexture9 vlcMemoryTexture;
  pSprite: ID3DXSprite;
public:
	VLC_ZFX(void);
	~VLC_ZFX(void);

	void init();
	void deInit();

	// callbacks
	void* VLCLock(void* opaque, void* plane);
	void* VLCUnlock(void* opaque, void* picture, void* plane);
	void* VLCdisplay(void* opaque, void* picture);
	
	// starting callback
	void VideoPlay(const std::string& videofile);

	// Rendering
	void OnFrameRender();
};
Cpp Datei

Code: Alles auswählen


VLC_ZFX::VLC_ZFX(void)
: video_width(800),video_height(600)
{
	vlcBuffer.resize(video_width*video_height*4+32);
}

VLC_ZFX::~VLC_ZFX(void)
{
}

// Initialization
void VLC_ZFX::init()
{
	pd3dDevice.CreateTexture(video_width, video_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, vlcVideoTexture, NULL);
	pd3dDevice.CreateTexture(video_width, video_height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, vlcMemoryTexture, NULL);
	D3DXCreateSprite(pd3dDevice, pSprite);
	vlcMutex = TCriticalSection.Create();
}

//Deinitialization
void VLC_ZFX::deInit()
{
	SAFE_RELEASE(vlcVideoTexture);
	SAFE_RELEASE(vlcMemoryTexture);
	SAFE_RELEASE(pSprite);
	vlcMutex.Free();
}

// ***********************************
//Callbacks
void* VLC_ZFX::VLCLock(void* opaque, void* plane)
{
	plane = &vclBuffer[0];
	vlcMutex.Enter();
	return NULL;
}

void* VLC_ZFX::VLCUnlock(void* opaque, void* picture, void* plane)
{
	vlcMutex.Leave();
	return NULL;
}

void* VLC_ZFX::VLCdisplay(void* opaque, void* picture)
{
	int i(0),j(0);
	D3DLOCKED_RECT prect;
	unsigned char* pTexBuffer(NULL);

  /// VLC outputs data in RGBA while we need to load data in BGRA into texture
  /// so, swap all Red and Blue values
	while (i<=(video_width*video_height-1)*4)
	{
		j = vlcBuffer[i];
		vlcBuffer[i] = vlcBuffer[i+2];
		vlcBuffer[i+2] = j;
		i += 4;
	}
  /// lock system memory texture and fill it with data
  if(vlcMemoryTexture.LockRect(0, prect, NULL, 0)== S_OK)
  {
    pTexBuffer = prect.pBits;
    for(i=0; i<video_height-1; ++i)
	{
      /// fill data into texture line by line
	// ******************** muss auch ne C-Version davon geben
      MoveMemory(pTexBuffer, vlcBuffer[i*video_width*4], video_width*4);
	// ******************** 
      /// and don't forget to offset by pitch, not by video_width*4
      pTexBuffer += prect.Pitch;
	}
    vlcMemoryTexture.UnlockRect(0);
  }
  return NULL;
}
// ***********************************

// Starting playback
void VLC_ZFX::VideoPlay(const std::string& videofile)
{
	void* pMedia(NULL);
	void* pMediaPlayer(NULL);

	pMedia = libvlc_media_new_path(vlc, videofile);
	pMediaPlayer = libvlc_media_player_new_from_media(pMedia);
	libvlc_media_release(pMedia);
	libvlc_video_set_callbacks(pMediaPlayer, VLCLock, VLCUnlock, VLCDisplay, NULL);
	libvlc_video_set_format(pMediaPlayer, "RGBA", video_width, video_height, video_width*4);
	libvlc_media_player_play(pMediaPlayer);
}

// Rendering
void VLC_ZFX::OnFrameRender()
{
	TD3DXMatrixA16 mat;
	TD3DXVector2 scale;

	//{ Prepare to render the scene here }

	// ************** Bin mir nicht ganz wegen dem 'or' sicher
	//pSprite._Begin(D3DXSPRITE_DONOTSAVESTATE or D3DXSPRITE_DO_NOT_ADDREF_TEXTURE);
	pSprite._Begin(D3DXSPRITE_DONOTSAVESTATE | D3DXSPRITE_DO_NOT_ADDREF_TEXTURE);
	// ***********************

	/// update video texture which we are going to render now, from system memory texture
	pd3dDevice.UpdateTexture(vlcMemoryTexture, vlcVideoTexture);

	/// stretch sprite so video texture will fit in window.
	/// window_width and window_height are window's dimensions
	scale.x = window_width/video_width;
	scale.y = window_height/video_height;
	D3DXMatrixTransformation2D(mat,  NULL, 0, scale, NULL, 0, NULL);
	pSprite.SetTransform(mat);

	/// finally, render it
	pSprite.Draw( vlcVideoTexture, NULL, NULL, NULL, 0xFFFFFFFF );
	pSprite._End();

	//{ End scene rendering here}
}
Joar, ich denke es werden noch einige Fehler drinnen sein, vlt. fällten jemanden auch noch etwas auf.
[/Edit]

€dit2: Ich weiß nicht was diese "TCriticalSection"-Klasse macht, und ob es ein C/C++-Äquivalent gibt.

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:15
von Chromanoid
Ich hab mir das irgendwann mal für SDL zusammenkopiert. Für ein angefangenes Open Source Projekt für Java (http://kenai.com/projects/javavideograbber). Vielleicht kannst du damit ja was anfangen...
http://kenai.com/projects/javavideograb ... SDLVMG.cpp

Der Hauptteil des CPP Codes kommt hier her: http://wiki.videolan.org/LibVLC_SampleCode_SDL sollte ich eigentlich mal in den code schreiben, naja vergisst man bei der WTFPL schnell :)

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:31
von D3DX
@joggel
Ja, richtig.
Da habe erstmal angefangen mit libvlc und das problem dort war die sache zu initialisieren.
das lag tatsächlich an der version 1.1.4 wovon ich die libvcl.lib benutzt habe. Mit 1.1.9 hat es dann geklappt.
das meinte ich mit Problem gelöst.

daß ich mit dem video zu d3dtexture noch probleme bekommen werde, war mir ja schon fast klar, aber das wollte ich natürlich selber rausfinden.
nur dafür musste ich erstmal die init() hinbekommen und deswegen der erste thread von mir.

Danke für deine Übersetzung, werde sie mir mal morgen vornehmen, denn für heute ist erstmal schluss

@Aramis
ja das mit dem selber übersetzen ist ja schon richtig. War auch sehr viel verlangt von mir,
nur wenn man seit zwei tagen ohne erfolg nach anleitungen für directx+libvlc im netz sucht, stellt man auch solche fragen.

Naja, ich verstehe halt ein paar sachen im pascal nicht.

Code: Alles auswählen

nil oder :=
vlcMutex: TCriticalSection;
vlcBuffer: array [0 .. video_width*video_height*4+32] of byte;
Marco

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:36
von Chromanoid
nil ->
NULL
:= ->
=
vlcMutex: TCriticalSection (Variable: Typ) ->
TCriticalSection vlcMutex (Typ Variable)
vlcBuffer: array [0 .. video_width*video_height*4+32] of byte; ->
byte vlcBuffer[video_width*video_height*4+32];

btw TCriticalSection musst du mit einem Mutex Konstrukt aus CPP ersetzen. Keine Ahnung was das da ist :).

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:39
von Krishty
D3DX hat geschrieben:Naja, ich verstehe halt ein paar sachen im pascal nicht.

Code: Alles auswählen

nil oder :=
vlcMutex: TCriticalSection;
vlcBuffer: array [0 .. video_width*video_height*4+32] of byte;
nil ist das Äquivalent zu nullptr bzw. NULL

:= ist der Zuweisungsoperator – während in C++ = eine Zuweisung und == ein Vergleich ist, ist in Pascal := eine Zuweisung und = ein Vergleich (wie in der Mathematik)

array [0 .. video_width*video_height*4+32] of byte; ist so ziemlich selbsterklärend: Ein Array von bytes, das von 0 bis video_width*video_height*4+32 adressierbar, also video_width*video_height*4+32 Bytes groß ist (man kann in Pascal im Gegensatz zu C++ auch Arrays erzeugen, deren erster Index bei 1 oder 1337 oder sonstwo liegt) … 4 Bytes pro Pixel für RGBA plus 32 Bytes für Metadaten, würde ich tippen

Falls ich den Info-Unterricht 10. Klasse noch recht in Erinnerung habe

Mal wieder zu spät – egal, ++myPostCount

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:41
von Chromanoid
Ah habt ihr Turbo Pascal oder Delphi gemacht oder was ganz anderes? :) Ich hab mit Turbo Pascal angefangen :)

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:42
von Krishty
Beides. Naja, die anderen jedenfalls. Mich hat der nette Herr machen lassen, was ich wollte. DevC++ Portable auf dem USB-Stick – fick ja!

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:45
von joggel
Ich hab auch mit Turbo Pascal angefangen... TP6.0 ... :)
Hach, das waren noch Zeiten... :roll:


Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!
Ich werde nur Antworten wenn ich gefragt werde!

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:48
von Krishty
Dich hat aber keiner gefragt.

Naaah, nur Spaß!

Re: Übersetzung von Pascal nach C++

Verfasst: 03.05.2011, 23:50
von D3DX
Danke für eure Antworten...