main.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <sys/mman.h>
  7. #include <unistd.h>
  8. #include <sys/ioctl.h>
  9. #include <string.h>
  10. #include <sys/time.h>
  11. #include "memalloc.h"
  12. #include "mfcapi.h"
  13. #include "ppapi.h"
  14. #define MEMALLOC_MODULE_PATH "/dev/memalloc"
  15. #define MAX_STREAM_BUFFER_SIZE (1024*1024)
  16. int fd_memalloc = -1;
  17. int lg_nCurWriteFrame = 0;
  18. OutFrameBuffer out_buffer;
  19. DWLLinearMem_t in_buffer;
  20. int alloc_input_buffer(void)
  21. {
  22. u32 pgsize = getpagesize();
  23. MemallocParams params;
  24. DWLLinearMem_t *info = &in_buffer;
  25. int fd_mem;
  26. int size = MAX_STREAM_BUFFER_SIZE;
  27. fd_memalloc = open(MEMALLOC_MODULE_PATH, O_RDWR | O_SYNC);
  28. if (fd_memalloc == -1) {
  29. printf("Failed to open: %s\n", MEMALLOC_MODULE_PATH);
  30. return -1;
  31. }
  32. info->size = size;
  33. info->virtualAddress = MAP_FAILED;
  34. info->busAddress = 0;
  35. params.size = size;
  36. fd_mem = open("/dev/mem", O_RDWR | O_SYNC);
  37. if (fd_mem == -1) {
  38. printf("Failed to open: %s\n", "/dev/mem");
  39. return -1;
  40. }
  41. /* get memory linear memory buffers */
  42. ioctl(fd_memalloc, MEMALLOC_IOCXGETBUFFER, &params);
  43. if (params.busAddress == 0) {
  44. printf("Memalloc: get buffer failure\n");
  45. close(fd_mem);
  46. return -1;
  47. }
  48. info->busAddress = params.busAddress;
  49. //printf("busAddress=0x%x\n", params.busAddress);
  50. /* Map the bus address to virtual address */
  51. info->virtualAddress = (u32 *) mmap(0, info->size, PROT_READ | PROT_WRITE,
  52. MAP_SHARED, fd_mem, params.busAddress);
  53. if (info->virtualAddress == MAP_FAILED) {
  54. close(fd_mem);
  55. return -1;
  56. }
  57. close(fd_mem);
  58. return 0;
  59. }
  60. int free_input_buffer(void)
  61. {
  62. ioctl(fd_memalloc, MEMALLOC_IOCSFREEBUFFER, &in_buffer.busAddress);
  63. close(fd_memalloc);
  64. munmap(in_buffer.virtualAddress, MAX_STREAM_BUFFER_SIZE);
  65. return 0;
  66. }
  67. unsigned long get_file_size(const char *path)
  68. {
  69. unsigned long filesize = -1;
  70. struct stat statbuff;
  71. if(stat(path, &statbuff) < 0){
  72. return filesize;
  73. }else{
  74. filesize = statbuff.st_size;
  75. }
  76. return filesize;
  77. }
  78. int hd_save_decoded_picture(char *output_file_name, char *pData, int nLen)
  79. {
  80. int nWriteLen;
  81. int fdOutput;
  82. if (lg_nCurWriteFrame == 0)
  83. fdOutput = open(output_file_name, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC,
  84. S_IRUSR | S_IWUSR);
  85. else
  86. fdOutput = open(output_file_name, O_WRONLY | O_CREAT | O_APPEND | O_SYNC,
  87. S_IRUSR | S_IWUSR);
  88. if (fdOutput == -1) {
  89. printf("Open saved file failed\r\n");
  90. return 0;
  91. }
  92. nWriteLen = write(fdOutput, pData, nLen);
  93. if (nWriteLen != nLen) {
  94. printf("Write data len less than requested\r\n");
  95. }
  96. close(fdOutput);
  97. lg_nCurWriteFrame++;
  98. return nWriteLen;
  99. }
  100. static int get_stream_type(char *type_name)
  101. {
  102. if (!strcasecmp(type_name, "h264"))
  103. return RAW_STRM_TYPE_H264;
  104. else if (!strcasecmp(type_name, "mpeg2"))
  105. return RAW_STRM_TYPE_MP2;
  106. else if (!strcasecmp(type_name, "mp4"))
  107. return RAW_STRM_TYPE_MP4;
  108. else if (!strcasecmp(type_name, "rv30") || !strcasecmp(type_name, "rv40"))
  109. return RAW_STRM_TYPE_REAL;
  110. else if (!strcasecmp(type_name, "vc1"))
  111. return RAW_STRM_TYPE_VC1;
  112. else if (!strcasecmp(type_name, "jpeg"))
  113. return RAW_STRM_TYPE_JPEG;
  114. else if (!strcasecmp(type_name, "sor"))
  115. return RAW_STRM_TYPE_SOR;
  116. else if (!strcasecmp(type_name, "vp8"))
  117. return RAW_STRM_TYPE_VP8;
  118. else if (!strcasecmp(type_name, "vp6"))
  119. return RAW_STRM_TYPE_VP6;
  120. else if (!strcasecmp(type_name, "wmv3"))
  121. return RAW_STRM_TYPE_WMV3;
  122. else {
  123. printf("unsupported stream type.\n");
  124. return -1;
  125. }
  126. }
  127. int main(int argc, char *argv[])
  128. {
  129. int i, j;
  130. char filename[32];
  131. MFCHandle *handle;
  132. int stream_type;
  133. int fd_stream = -1, fd_len = -1;
  134. int len;
  135. int ppenable = 0;
  136. int ppoutw, ppouth, ppformat;
  137. int framelen;
  138. int ret;
  139. if (argc != 5 && argc != 8) {/*/media/testfile/VC1/5.wmv.vbs /media/testfile/VC1/5.wmv.len vc1 /media/tmfcout/vc1.yuv*/
  140. printf("Usage: %s stream_file len_file stream_type outputfile [ppoutw ppouth ppformat(0:RGB565 1:RGB32)].\n", argv[0]);
  141. return -1;
  142. }
  143. if ((stream_type = get_stream_type(argv[3])) < 0)
  144. return -1;
  145. again:
  146. alloc_input_buffer();
  147. handle = mfc_init(stream_type);
  148. if (!handle) {
  149. printf("streamType %d mfc_init fail.\n", stream_type);
  150. }
  151. printf("handle=0x%x, instance=0x%x.\n", handle, handle->decInst);
  152. if (argc > 5) {
  153. ppenable = 1;
  154. char *endptr;
  155. ppoutw = strtoul(argv[5], &endptr, 10);
  156. ppouth = strtoul(argv[6], &endptr, 10);
  157. ppformat = strtoul(argv[7], &endptr, 10);
  158. mfc_pp_init(handle, ppoutw, ppouth, ppformat);
  159. }
  160. fd_stream = open(argv[1], O_RDWR);
  161. if (fd_stream == -1) {
  162. printf("open stream file %s fail.\n", argv[1]);
  163. goto end;
  164. }
  165. fd_len = open(argv[2], O_RDWR);
  166. if (fd_len == -1) {
  167. printf("open len file %s fail.\n", argv[2]);
  168. goto end;
  169. }
  170. while(read(fd_len, &len, 4) > 0) {
  171. printf("len %d.\n", len);
  172. read(fd_stream, in_buffer.virtualAddress, len);
  173. in_buffer.size = len;
  174. out_buffer.num = 0;
  175. struct timeval tm1, tm2;
  176. gettimeofday(&tm1, NULL);
  177. ret = mfc_decode(handle, &in_buffer, &out_buffer);
  178. gettimeofday(&tm2, NULL);
  179. /*printf("decode %d frame time %d us.\n", out_buffer.num, (tm2.tv_sec - tm1.tv_sec) * 1000000 + tm2.tv_usec - tm1.tv_usec);
  180. printf("%d,%d - %d,%d.ret=%d.\n", out_buffer.codedWidth, out_buffer.codedHeight,
  181. out_buffer.frameWidth, out_buffer.frameHeight, ret);*/
  182. if (ppenable) {
  183. if (ppformat)
  184. framelen = out_buffer.frameWidth * out_buffer.frameHeight * 4;
  185. else
  186. framelen = out_buffer.frameWidth * out_buffer.frameHeight * 2;
  187. } else {
  188. framelen = out_buffer.frameWidth * out_buffer.frameHeight * 3 / 2;
  189. }
  190. for (j = 0; j < out_buffer.num; j++) {
  191. printf("frame %d saved.\n", lg_nCurWriteFrame);
  192. printf("outbuf 0x%x.%d.%d\n", out_buffer.buffer[j].pyVirAddress, out_buffer.frameWidth, out_buffer.frameHeight);
  193. hd_save_decoded_picture(argv[4], (char*) out_buffer.buffer[j].pyVirAddress,
  194. framelen);
  195. }
  196. }
  197. /* while(mfc_decode_eof(handle, &out_buffer)) {
  198. printf("frame %d saved.\n", lg_nCurWriteFrame);
  199. printf("outbuf 0x%x.\n", out_buffer.buffer[0].pyVirAddress);
  200. hd_save_decoded_picture(argv[4], (char*) out_buffer.buffer[0].pyVirAddress,
  201. framelen);
  202. } */
  203. end:
  204. if (fd_stream > 0)
  205. close(fd_stream);
  206. if (fd_len > 0)
  207. close(fd_len);
  208. mfc_uninit(handle);
  209. free_input_buffer();
  210. //goto again;
  211. return 0;
  212. }