InputInternet.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "InputInternet.h"
  2. DWORD WINAPI httpThreadFunc(LPVOID lpData)
  3. {
  4. MediaInputInternet *input = (MediaInputInternet *) lpData;
  5. DWORD read;
  6. char  buffer[8192];
  7. while(input->downloaded < input->size) {
  8. read = 0;
  9. InternetReadFile(input->http, (void *) buffer, 8192, &read);
  10. fwrite(buffer, 1, read, input->dnld);
  11. input->downloaded += read;
  12. WaitForSingleObject(input->bufferingMutex, INFINITE);
  13. if(input->file)
  14. fclose(input->file);
  15. input->file = fopen("c:\temp.avi", "rb");
  16. fseek(input->file, input->lastReadPos, SEEK_SET);
  17. ReleaseMutex(input->bufferingMutex);
  18. }
  19. return 0;
  20. }
  21. MediaInputInternet::MediaInputInternet()
  22. {
  23. this->file = NULL;
  24. this->hInternet  = NULL;
  25. this->http       = NULL;
  26. this->buffering  = 0;
  27. this->downloaded = 0;
  28. this->size       = BUFFERING_SIZE;
  29. this->bufferingMutex = CreateMutex(NULL, FALSE, NULL);
  30. }
  31. MediaInputInternet::~MediaInputInternet()
  32. {
  33. CloseHandle(this->bufferingMutex);
  34. }
  35. media_type_t MediaInputInternet::GetType()
  36. {
  37. return MEDIA_TYPE_INPUT;
  38. }
  39. char *MediaInputInternet::GetName()
  40. {
  41. return "HTTP/FTP Input";
  42. }
  43. MP_RESULT MediaInputInternet::Connect(MediaItem *item)
  44. {
  45. return MP_RESULT_ERROR;
  46. }
  47. MP_RESULT MediaInputInternet::ReleaseConnections()
  48. {
  49. return MP_RESULT_ERROR;
  50. }
  51. DWORD         MediaInputInternet::GetCaps()
  52. {
  53. return MEDIA_CAPS_BUFFERIZE;
  54. }
  55. MP_RESULT     MediaInputInternet::Configure(HINSTANCE hInstance, HWND hwnd)
  56. {
  57. return MP_RESULT_ERROR;
  58. }
  59. MP_RESULT MediaInputInternet::Open(char *url, media_input_mode_t mode) 
  60. {
  61. this->file = NULL;
  62. this->hInternet   = NULL;
  63. this->http        = NULL;
  64. this->buffering   = 0;
  65. this->downloaded  = 0;
  66. this->lastReadPos = 0;
  67. if(url != NULL) {
  68. this->hInternet = InternetOpen("The Playa - OpenDivX Viewer",
  69.    INTERNET_OPEN_TYPE_DIRECT,
  70.    NULL, NULL, 0);
  71. if(this->hInternet == NULL) {
  72. MP_ERROR("Could not open an Internet connection");
  73. return MP_RESULT_ERROR;
  74. }
  75. this->http = InternetOpenUrl(this->hInternet, url, NULL, -1, 0, 0);
  76. if(this->http == NULL) {
  77. InternetCloseHandle(this->hInternet);
  78. MP_ERROR("The location could not be opened");
  79. return MP_RESULT_ERROR;
  80. }
  81. DWORD buffer;
  82. DWORD dwLength = 4;
  83. if(!HttpQueryInfo(this->http, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &buffer, &dwLength, NULL)) {
  84. InternetCloseHandle(this->http);
  85. InternetCloseHandle(this->hInternet);
  86. MP_ERROR("Could not get the media size");
  87. return MP_RESULT_ERROR;
  88. }
  89. else {
  90. this->size = buffer;
  91. }
  92. this->dnld = fopen("c:\temp.avi", "w+b");
  93. if(this->dnld == NULL) {
  94. InternetCloseHandle(this->http);
  95. InternetCloseHandle(this->hInternet);
  96. MP_ERROR("Could not create temp file, check your settings.");
  97. return MP_RESULT_ERROR;
  98. }
  99. this->httpThread = CreateThread(NULL, 0, httpThreadFunc, (LPVOID) this, 0, &this->httpId);
  100. if(this->file == NULL) {
  101. WaitForSingleObject(this->bufferingMutex, INFINITE);
  102. if( (this->file = fopen("c:\temp.avi", "rb")) == NULL) {
  103. TerminateThread(this->httpThread, 0);
  104. fclose(this->dnld);
  105. InternetCloseHandle(this->http);
  106. InternetCloseHandle(this->hInternet);
  107. MP_ERROR("Could not open temp file!");
  108. return MP_RESULT_ERROR;
  109. }
  110. ReleaseMutex(this->bufferingMutex);
  111. }
  112. }
  113. return MP_RESULT_OK;
  114. }
  115. long MediaInputInternet::GetSize()
  116. {
  117. if(this->file)
  118. return this->size;
  119. return MP_RESULT_ERROR;
  120. }
  121. long MediaInputInternet::GetBufferSize()
  122. {
  123. if(this->dnld) {
  124. return this->downloaded;
  125. }
  126. return 0;
  127. }
  128. long MediaInputInternet::GetBufferPosition()
  129. {
  130. if(this->dnld) {
  131. return this->lastReadPos;
  132. }
  133. return 0;
  134. }
  135. long MediaInputInternet::GetBufferingSize()
  136. {
  137. return BUFFERING_SIZE;
  138. }
  139. unsigned int MediaInputInternet::Read(MediaBuffer *mb, unsigned int size)
  140. {
  141. if(!mb || !this->file) {
  142. return MP_RESULT_ERROR;
  143. }
  144. if(size > mb->GetSize())
  145. mb->ReAlloc(size);
  146. if(this->file != NULL) {
  147. unsigned int result;
  148. WaitForSingleObject(this->bufferingMutex, INFINITE);
  149. result = fread(mb->GetData(), 1, size, this->file);
  150. this->lastReadPos = ftell(this->file);
  151. ReleaseMutex(this->bufferingMutex);
  152. return result;
  153. }
  154. else {
  155. return 0;
  156. }
  157. }
  158. unsigned int MediaInputInternet::Seek(int size, media_input_seek_t method)
  159. {
  160. unsigned int result;
  161. if(!this->file)
  162. return MP_RESULT_ERROR;
  163. WaitForSingleObject(this->bufferingMutex, INFINITE);
  164. switch(method) {
  165. case INPUT_SEEK_SET:
  166. result = fseek(this->file, size, SEEK_SET);
  167. this->lastReadPos = ftell(this->file);
  168. ReleaseMutex(this->bufferingMutex);
  169. return result;
  170. break;
  171. case INPUT_SEEK_CUR:
  172. if(size == 0) {
  173. result = ftell(this->file);
  174. this->lastReadPos = result;
  175. ReleaseMutex(this->bufferingMutex);
  176. return result;
  177. }
  178. else {
  179. result = fseek(this->file, size, SEEK_CUR);
  180. this->lastReadPos = ftell(this->file);
  181. ReleaseMutex(this->bufferingMutex);
  182. return result;
  183. }
  184. break;
  185. case INPUT_SEEK_END:
  186. result = fseek(this->file, size, SEEK_END);
  187. this->lastReadPos = ftell(this->file);
  188. ReleaseMutex(this->bufferingMutex);
  189. return result;
  190. break;
  191. }
  192. ReleaseMutex(this->bufferingMutex);
  193. return MP_RESULT_ERROR;
  194. }
  195. unsigned int MediaInputInternet::GetLine(MediaBuffer *mb)
  196. {
  197. if(!this->file)
  198. return MP_RESULT_ERROR;
  199. WaitForSingleObject(this->bufferingMutex, INFINITE);
  200. fgets((char *) mb->GetData(), mb->GetSize(), this->file);
  201. ReleaseMutex(this->bufferingMutex);
  202. return MP_RESULT_OK;
  203. }
  204. BOOL MediaInputInternet::EndOfFile()
  205. {
  206. return FALSE;
  207. }
  208. MP_RESULT MediaInputInternet::Close()
  209. {
  210. if(!this->file)
  211. return MP_RESULT_ERROR;
  212. WaitForSingleObject(this->bufferingMutex, INFINITE);
  213. TerminateThread(this->httpThread, 0);
  214. ReleaseMutex(this->bufferingMutex);
  215. fclose(this->dnld);
  216. InternetCloseHandle(this->http);
  217. InternetCloseHandle(this->hInternet);
  218. if(this->file)
  219. fclose(this->file);
  220. DeleteFile("c:\temp.avi");
  221. return MP_RESULT_OK;
  222. }