📄 inputinternet.cpp
字号:
#include "InputInternet.h"
DWORD WINAPI httpThreadFunc(LPVOID lpData)
{
MediaInputInternet *input = (MediaInputInternet *) lpData;
DWORD read;
char buffer[8192];
while(input->downloaded < input->size) {
read = 0;
InternetReadFile(input->http, (void *) buffer, 8192, &read);
fwrite(buffer, 1, read, input->dnld);
input->downloaded += read;
WaitForSingleObject(input->bufferingMutex, INFINITE);
if(input->file)
fclose(input->file);
input->file = fopen("c:\\temp.avi", "rb");
fseek(input->file, input->lastReadPos, SEEK_SET);
ReleaseMutex(input->bufferingMutex);
}
return 0;
}
MediaInputInternet::MediaInputInternet()
{
this->file = NULL;
this->hInternet = NULL;
this->http = NULL;
this->buffering = 0;
this->downloaded = 0;
this->size = BUFFERING_SIZE;
this->bufferingMutex = CreateMutex(NULL, FALSE, NULL);
}
MediaInputInternet::~MediaInputInternet()
{
CloseHandle(this->bufferingMutex);
}
media_type_t MediaInputInternet::GetType()
{
return MEDIA_TYPE_INPUT;
}
char *MediaInputInternet::GetName()
{
return "HTTP/FTP Input";
}
MP_RESULT MediaInputInternet::Connect(MediaItem *item)
{
return MP_RESULT_ERROR;
}
MP_RESULT MediaInputInternet::ReleaseConnections()
{
return MP_RESULT_ERROR;
}
DWORD MediaInputInternet::GetCaps()
{
return MEDIA_CAPS_BUFFERIZE;
}
MP_RESULT MediaInputInternet::Configure(HINSTANCE hInstance, HWND hwnd)
{
return MP_RESULT_ERROR;
}
MP_RESULT MediaInputInternet::Open(char *url, media_input_mode_t mode)
{
this->file = NULL;
this->hInternet = NULL;
this->http = NULL;
this->buffering = 0;
this->downloaded = 0;
this->lastReadPos = 0;
if(url != NULL) {
this->hInternet = InternetOpen("The Playa - OpenDivX Viewer",
INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0);
if(this->hInternet == NULL) {
MP_ERROR("Could not open an Internet connection");
return MP_RESULT_ERROR;
}
this->http = InternetOpenUrl(this->hInternet, url, NULL, -1, 0, 0);
if(this->http == NULL) {
InternetCloseHandle(this->hInternet);
MP_ERROR("The location could not be opened");
return MP_RESULT_ERROR;
}
DWORD buffer;
DWORD dwLength = 4;
if(!HttpQueryInfo(this->http, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &buffer, &dwLength, NULL)) {
InternetCloseHandle(this->http);
InternetCloseHandle(this->hInternet);
MP_ERROR("Could not get the media size");
return MP_RESULT_ERROR;
}
else {
this->size = buffer;
}
this->dnld = fopen("c:\\temp.avi", "w+b");
if(this->dnld == NULL) {
InternetCloseHandle(this->http);
InternetCloseHandle(this->hInternet);
MP_ERROR("Could not create temp file, check your settings.");
return MP_RESULT_ERROR;
}
this->httpThread = CreateThread(NULL, 0, httpThreadFunc, (LPVOID) this, 0, &this->httpId);
if(this->file == NULL) {
WaitForSingleObject(this->bufferingMutex, INFINITE);
if( (this->file = fopen("c:\\temp.avi", "rb")) == NULL) {
TerminateThread(this->httpThread, 0);
fclose(this->dnld);
InternetCloseHandle(this->http);
InternetCloseHandle(this->hInternet);
MP_ERROR("Could not open temp file!");
return MP_RESULT_ERROR;
}
ReleaseMutex(this->bufferingMutex);
}
}
return MP_RESULT_OK;
}
long MediaInputInternet::GetSize()
{
if(this->file)
return this->size;
return MP_RESULT_ERROR;
}
long MediaInputInternet::GetBufferSize()
{
if(this->dnld) {
return this->downloaded;
}
return 0;
}
long MediaInputInternet::GetBufferPosition()
{
if(this->dnld) {
return this->lastReadPos;
}
return 0;
}
long MediaInputInternet::GetBufferingSize()
{
return BUFFERING_SIZE;
}
unsigned int MediaInputInternet::Read(MediaBuffer *mb, unsigned int size)
{
if(!mb || !this->file) {
return MP_RESULT_ERROR;
}
if(size > mb->GetSize())
mb->ReAlloc(size);
if(this->file != NULL) {
unsigned int result;
WaitForSingleObject(this->bufferingMutex, INFINITE);
result = fread(mb->GetData(), 1, size, this->file);
this->lastReadPos = ftell(this->file);
ReleaseMutex(this->bufferingMutex);
return result;
}
else {
return 0;
}
}
unsigned int MediaInputInternet::Seek(int size, media_input_seek_t method)
{
unsigned int result;
if(!this->file)
return MP_RESULT_ERROR;
WaitForSingleObject(this->bufferingMutex, INFINITE);
switch(method) {
case INPUT_SEEK_SET:
result = fseek(this->file, size, SEEK_SET);
this->lastReadPos = ftell(this->file);
ReleaseMutex(this->bufferingMutex);
return result;
break;
case INPUT_SEEK_CUR:
if(size == 0) {
result = ftell(this->file);
this->lastReadPos = result;
ReleaseMutex(this->bufferingMutex);
return result;
}
else {
result = fseek(this->file, size, SEEK_CUR);
this->lastReadPos = ftell(this->file);
ReleaseMutex(this->bufferingMutex);
return result;
}
break;
case INPUT_SEEK_END:
result = fseek(this->file, size, SEEK_END);
this->lastReadPos = ftell(this->file);
ReleaseMutex(this->bufferingMutex);
return result;
break;
}
ReleaseMutex(this->bufferingMutex);
return MP_RESULT_ERROR;
}
unsigned int MediaInputInternet::GetLine(MediaBuffer *mb)
{
if(!this->file)
return MP_RESULT_ERROR;
WaitForSingleObject(this->bufferingMutex, INFINITE);
fgets((char *) mb->GetData(), mb->GetSize(), this->file);
ReleaseMutex(this->bufferingMutex);
return MP_RESULT_OK;
}
BOOL MediaInputInternet::EndOfFile()
{
return FALSE;
}
MP_RESULT MediaInputInternet::Close()
{
if(!this->file)
return MP_RESULT_ERROR;
WaitForSingleObject(this->bufferingMutex, INFINITE);
TerminateThread(this->httpThread, 0);
ReleaseMutex(this->bufferingMutex);
fclose(this->dnld);
InternetCloseHandle(this->http);
InternetCloseHandle(this->hInternet);
if(this->file)
fclose(this->file);
DeleteFile("c:\\temp.avi");
return MP_RESULT_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -