www.pudn.com > MyPlayerbylqh.rar > SubtitlesMicroDVD.cpp


/************************************************************************************** 
 *                                                                                    * 
 *                                                                                    * 
 **************************************************************************************/ 
 
#include "SubtitlesMicroDVD.h" 
 
 
 
MediaSubtitlerMicroDVD::MediaSubtitlerMicroDVD() 
{ 
	this->inputFile   = new MediaInput(); 
	this->inputBuffer = new MediaBuffer(); 
} 
 
MediaSubtitlerMicroDVD::~MediaSubtitlerMicroDVD() 
{ 
	delete this->inputFile; 
	delete this->inputBuffer; 
} 
 
media_type_t  MediaSubtitlerMicroDVD::GetType() 
{ 
	return MEDIA_TYPE_SUBTITLER; 
} 
 
char         *MediaSubtitlerMicroDVD::GetName() 
{ 
	return "MicroDVD Subtitle Reader"; 
} 
 
MP_RESULT     MediaSubtitlerMicroDVD::Connect(MediaItem *item) 
{ 
 
 
	return MP_RESULT_OK; 
} 
 
MP_RESULT     MediaSubtitlerMicroDVD::ReleaseConnections() 
{ 
	return MP_RESULT_OK; 
} 
 
DWORD         MediaSubtitlerMicroDVD::GetCaps() 
{ 
	return 0; 
} 
 
MP_RESULT     MediaSubtitlerMicroDVD::Configure(HINSTANCE hInstance, HWND hwnd) 
{ 
	return MP_RESULT_ERROR; 
} 
 
 
 
MP_RESULT MediaSubtitlerMicroDVD::ParseSubtitle() 
{ 
	char text[512]; 
	DWORD i, j, count; 
 
	if( sscanf((char *) this->inputBuffer->GetData(), "{%d}{%d}", &this->firstFrame, &this->lastFrame) != 2) 
		return MP_RESULT_ERROR; 
 
 
 
	strcpy(text, strrchr((char *) this->inputBuffer->GetData(), '}') + 1); 
	 
 
 
	i     = 0; 
	count = 0; 
 
	for(j=0; j < strlen(text); j++) { 
 
		if(text[j] == '|') { 
 
			this->subtitles.subtitlesText[i][count] = '\0'; 
			i++; 
			count = 0; 
		} 
		else { 
 
			if(text[j] == '\n') { 
 
				this->subtitles.subtitlesText[i][count] = '\0'; 
				break; 
			} 
			else { 
 
				this->subtitles.subtitlesText[i][count] = text[j]; 
				count++; 
			} 
		} 
	} 
 
	this->subtitles.nbSubtitles = i + 1; 
 
	return MP_RESULT_OK; 
} 
 
 
 
MP_RESULT MediaSubtitlerMicroDVD::SeekToFrame(DWORD frameNumber) 
{ 
	if(frameNumber > this->lastFrame) { 
 
 
 
		do { 
 
			this->inputFile->GetLine(this->inputBuffer); 
 
			this->previousLastFrame = this->lastFrame; 
 
			if(sscanf((char *) this->inputBuffer->GetData(), "{%d}{%d}", &this->firstFrame, &this->lastFrame) != 2) { 
 
				return MP_RESULT_ERROR; 
			} 
		 
		} 
		while(this->firstFrame < frameNumber); 
 
		this->ParseSubtitle(); 
	} 
	else { 
 
 
		this->inputFile->Seek(0, INPUT_SEEK_SET); 
 
		this->firstFrame = 0; 
		this->lastFrame  = 0; 
 
		this->previousLastFrame = 0; 
 
		SeekToFrame(frameNumber); 
	} 
 
	return MP_RESULT_OK; 
} 
 
 
 
 
MP_RESULT    MediaSubtitlerMicroDVD::Open(char *lpFilename) 
{ 
	if(lpFilename) { 
 
		this->firstFrame         = 0; 
		this->lastFrame          = 0; 
		this->firstSubtitleFrame = 0; 
		this->previousLastFrame  = 0; 
 
		if(this->inputFile->Open(lpFilename, INPUT_OPEN_ASCII) == MP_RESULT_OK) { 
 
 
			 
			this->inputBuffer->Alloc(SUB_INPUT_BUFFER_SIZE); 
 
			this->subtitles.subtitlesText[0] = (char *) new char[256]; 
			this->subtitles.subtitlesText[1] = (char *) new char[256]; 
			this->subtitles.subtitlesText[2] = (char *) new char[256]; 
			this->subtitles.subtitlesText[3] = (char *) new char[256]; 
			this->subtitles.nbSubtitles = 0; 
 
			this->inputFile->GetLine(this->inputBuffer); 
 
			if(this->ParseSubtitle() == MP_RESULT_OK) { 
 
				this->firstSubtitleFrame = this->firstFrame; 
				this->previousLastFrame  = 0; 
 
 
				return MP_RESULT_OK; 
			} 
 
		} 
	} 
 
	return MP_RESULT_ERROR; 
} 
 
subtitles_t *MediaSubtitlerMicroDVD::GetSubtitles(DWORD frameNumber) 
{ 
	if(frameNumber < this->firstSubtitleFrame) { 
	 
		return NULL; 
	} 
 
	if(frameNumber < this->firstFrame && frameNumber > this->previousLastFrame) { 
 
		return NULL; 
	} 
 
	if(frameNumber >= this->firstFrame && frameNumber < this->lastFrame) { 
 
 
 
		return &this->subtitles; 
	} 
	else { 
	 
 
 
		this->SeekToFrame(frameNumber); 
		 
		return NULL; 
	} 
 
	return NULL; 
} 
 
MP_RESULT    MediaSubtitlerMicroDVD::Close() 
{ 
	if(this->inputFile) { 
	 
		this->inputFile->Close(); 
	} 
 
	return MP_RESULT_ERROR; 
}