main.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include <mpeg4ip.h>
  22. #include <mpeg4ip_getopt.h>
  23. #include "rgb2yuv.h"
  24. /* globals */
  25. char* progName;
  26. /*
  27.  * rgb2yuv
  28.  * required arg1 should be the input RAW RGB24 file
  29.  * required arg2 should be the output RAW YUV12 file
  30.  */ 
  31. int main(int argc, char** argv)
  32. {
  33. /* variables controlable from command line */
  34. u_int frameWidth = 320; /* --width=<uint> */
  35. u_int frameHeight = 240; /* --height=<uint> */
  36. bool flip = FALSE; /* --flip */
  37. /* internal variables */
  38. char* rgbFileName = NULL;
  39. char* yuvFileName = NULL;
  40. FILE* rgbFile = NULL;
  41. FILE* yuvFile = NULL;
  42. u_int8_t* rgbBuf = NULL;
  43. u_int8_t* yBuf = NULL;
  44. u_int8_t* uBuf = NULL;
  45. u_int8_t* vBuf = NULL;
  46. u_int32_t videoFramesWritten = 0;
  47. /* begin process command line */
  48. progName = argv[0];
  49. while (1) {
  50. int c = -1;
  51. int option_index = 0;
  52. static struct option long_options[] = {
  53. { "flip", 0, 0, 'f' },
  54. { "height", 1, 0, 'h' },
  55. { "width", 1, 0, 'w' },
  56. { "version", 0, 0, 'V' },
  57. { NULL, 0, 0, 0 }
  58. };
  59. c = getopt_long_only(argc, argv, "fh:w:V",
  60. long_options, &option_index);
  61. if (c == -1)
  62. break;
  63. switch (c) {
  64. case 'f': {
  65. flip = TRUE;
  66. break;
  67. }
  68. case 'h': {
  69. /* --height <pixels> */
  70. u_int i;
  71. if (sscanf(optarg, "%u", &i) < 1) {
  72. fprintf(stderr, 
  73. "%s: bad height specified: %sn",
  74.  progName, optarg);
  75. } else if (frameHeight & 1) {
  76. fprintf(stderr, 
  77. "%s: bad height specified, must be multiple of 2: %sn",
  78.  progName, optarg);
  79. } else {
  80. /* currently no range checking */
  81. frameHeight = i;
  82. }
  83. break;
  84. }
  85. case 'w': {
  86. /* -width <pixels> */
  87. u_int i;
  88. if (sscanf(optarg, "%u", &i) < 1) {
  89. fprintf(stderr, 
  90. "%s: bad width specified: %sn",
  91.  progName, optarg);
  92. } else if (frameWidth & 1) {
  93. fprintf(stderr, 
  94. "%s: bad width specified, must be multiple of 2: %sn",
  95.  progName, optarg);
  96. } else {
  97. /* currently no range checking */
  98. frameWidth = i;
  99. }
  100. break;
  101. }
  102. case '?':
  103. break;
  104. case 'V':
  105.   fprintf(stderr, "%s - %s version %sn",
  106.   progName, PACKAGE, VERSION);
  107.   return (0);
  108. default:
  109. fprintf(stderr, "%s: unknown option specified, ignoring: %cn", 
  110. progName, c);
  111. }
  112. }
  113. /* check that we have at least two non-option arguments */
  114. if ((argc - optind) < 2) {
  115. fprintf(stderr, 
  116. "usage: %s <rgb-file> <yuv-file>n",
  117. progName);
  118. exit(1);
  119. }
  120. /* point to the specified file names */
  121. rgbFileName = argv[optind++];
  122. yuvFileName = argv[optind++];
  123. /* warn about extraneous non-option arguments */
  124. if (optind < argc) {
  125. fprintf(stderr, "%s: unknown options specified, ignoring: ");
  126. while (optind < argc) {
  127. fprintf(stderr, "%s ", argv[optind++]);
  128. }
  129. fprintf(stderr, "n");
  130. }
  131. /* end processing of command line */
  132. /* open the RGB file */
  133. rgbFile = fopen(rgbFileName, "rb");
  134. if (rgbFile == NULL) {
  135. fprintf(stderr, 
  136. "%s: error %s: %sn",
  137. progName, rgbFileName, strerror(errno));
  138. exit(4);
  139. }
  140. /* open the RAW file */
  141. yuvFile = fopen(yuvFileName, "wb");
  142. if (yuvFile == NULL) {
  143. fprintf(stderr,
  144. "%s: error opening %s: %sn",
  145. progName, yuvFileName, strerror(errno));
  146. exit(5);
  147. }
  148. /* get an input buffer for a frame */
  149. rgbBuf = (u_int8_t*)malloc(frameWidth * frameHeight * 3);
  150. /* get the output buffers for a frame */
  151. yBuf = (u_int8_t*)malloc(frameWidth * frameHeight);
  152. uBuf = (u_int8_t*)malloc((frameWidth * frameHeight) / 4);
  153. vBuf = (u_int8_t*)malloc((frameWidth * frameHeight) / 4);
  154. if (rgbBuf == NULL || yBuf == NULL || uBuf == NULL || vBuf == NULL) {
  155. fprintf(stderr,
  156. "%s: error allocating memory: %sn",
  157. progName, strerror(errno));
  158. exit(6);
  159. }
  160. while (fread(rgbBuf, 1, frameWidth * frameHeight * 3, rgbFile)) {
  161. RGB2YUV(frameWidth, frameHeight, rgbBuf, yBuf, uBuf, vBuf, flip);
  162. fwrite(yBuf, 1, frameWidth * frameHeight, yuvFile);
  163. fwrite(uBuf, 1, (frameWidth * frameHeight) / 4, yuvFile);
  164. fwrite(vBuf, 1, (frameWidth * frameHeight) / 4, yuvFile);
  165. videoFramesWritten++;
  166. }
  167. printf("%u %ux%u video frames writtenn", 
  168. videoFramesWritten, frameWidth, frameHeight);
  169. /* cleanup */
  170. fclose(rgbFile);
  171. fclose(yuvFile);
  172. return(0);
  173. }