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

流媒体/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. /* 
  22.  * Notes:
  23.  *  - file formatted with tabstops == 4 spaces 
  24.  *  - TBD == "To Be Done" 
  25.  */
  26. #include <mpeg4ip.h>
  27. #include <errno.h>
  28. #include <string.h>
  29. #include <mpeg4ip_getopt.h>
  30. #include <fcntl.h>
  31. #include <math.h>
  32. /* globals */
  33. char* progName = NULL;
  34. FILE* inFile = NULL;
  35. FILE* outFile = NULL;
  36. u_int8_t* planeBuf = NULL;
  37. /* forward declarations */
  38. static int cropPlane(u_int32_t inSize, u_int32_t outOffset, u_int32_t outSize);
  39. /*
  40.  * lboxcrop
  41.  * required arg1 should be the raw input file to be cropped
  42.  * required arg2 should be the raw output file
  43.  */ 
  44. int main(int argc, char** argv)
  45. {
  46. /* variables controlable from command line */
  47. float aspectRatio = 2.35; /* --aspect=<float> */
  48. u_int frameWidth = 320; /* --width=<uint> */
  49. u_int frameHeight = 240; /* --height=<uint> */
  50. /* internal variables */
  51. char* inFileName = NULL;
  52. char* outFileName = NULL;
  53. u_int32_t inYSize, inUVSize;
  54. u_int32_t outYStart, outYSize, outUVStart, outUVSize;
  55. u_int32_t cropHeight;
  56. u_int32_t frameNumber = 0;
  57. /* begin process command line */
  58. progName = argv[0];
  59. while (1) {
  60. int c = -1;
  61. int option_index = 0;
  62. static struct option long_options[] = {
  63. { "aspect", 1, 0, 'a' },
  64. { "height", 1, 0, 'h' },
  65. { "width", 1, 0, 'w' },
  66. { "version", 0, 0, 'V'},
  67. { NULL, 0, 0, 0 }
  68. };
  69. c = getopt_long_only(argc, argv, "a:h:w:V",
  70. long_options, &option_index);
  71. if (c == -1)
  72. break;
  73. /* TBD a help option would be nice */
  74. switch (c) {
  75. case 'a': {
  76. /* --aspect <ratio> */
  77. float f;
  78. if (sscanf(optarg, "%f", &f) < 1) {
  79. fprintf(stderr, 
  80. "%s: bad aspect ratio specified: %sn",
  81.  progName, optarg);
  82. } else {
  83. aspectRatio = f;
  84. }
  85. break;
  86. }
  87. case 'h': {
  88. /* --height <pixels> */
  89. u_int i;
  90. if (sscanf(optarg, "%u", &i) < 1) {
  91. fprintf(stderr, 
  92. "%s: bad height specified: %sn",
  93.  progName, optarg);
  94. } else {
  95. /* currently no range checking */
  96. frameHeight = i;
  97. }
  98. break;
  99. }
  100. case 'w': {
  101. /* -width <pixels> */
  102. u_int i;
  103. if (sscanf(optarg, "%u", &i) < 1) {
  104. fprintf(stderr, 
  105. "%s: bad width specified: %sn",
  106.  progName, optarg);
  107. } else {
  108. /* currently no range checking */
  109. frameWidth = i;
  110. }
  111. break;
  112. }
  113. case '?':
  114. break;
  115. case 'V':
  116.   fprintf(stderr, "%s - %s version %sn",
  117.   progName, PACKAGE, VERSION);
  118.   return (0);
  119. default:
  120. fprintf(stderr, "%s: unknown option specified, ignoring: %cn",
  121. progName, c);
  122. }
  123. }
  124. /* check that we have at least two non-option arguments */
  125. if ((argc - optind) < 2) {
  126. fprintf(stderr, 
  127. "usage: %s <infile> <outfile>n",
  128. progName);
  129. exit(1);
  130. }
  131. /* point to the specified file names */
  132. inFileName = argv[optind++];
  133. outFileName = argv[optind++];
  134. /* warn about extraneous non-option arguments */
  135. if (optind < argc) {
  136. fprintf(stderr, "%s: unknown options specified, ignoring: ", progName);
  137. while (optind < argc) {
  138. fprintf(stderr, "%s ", argv[optind++]);
  139. }
  140. fprintf(stderr, "n");
  141. }
  142. /* end processing of command line */
  143. /* open the raw input file for reading */
  144. inFile = fopen(inFileName, "rb");
  145. if (inFile == NULL) {
  146. /* error, file doesn't exist or we can't read it */
  147. fprintf(stderr,
  148. "%s: error opening %s: %sn",
  149. progName, inFileName, strerror(errno));
  150. exit(2);
  151. }
  152. /* open the raw output file for writing */
  153. outFile = fopen(outFileName, "wb");
  154. if (outFile == NULL) {
  155. /* error, file doesn't exist or we can't read it */
  156. fprintf(stderr,
  157. "%s: error opening %s: %sn",
  158. progName, outFileName, strerror(errno));
  159. exit(3);
  160. }
  161. /* calculate the necessary sizes */
  162. inYSize = frameWidth * frameHeight;
  163. inUVSize = inYSize >> 2;
  164. cropHeight = (float)frameWidth / aspectRatio;
  165. /* encoders need sizes to be a multiple of 16 */
  166. if ((cropHeight % 16) != 0) {
  167. cropHeight += 16 - (cropHeight % 16);
  168. }
  169. outYStart = frameWidth * ((frameHeight - cropHeight) >> 1);
  170. outYSize = frameWidth * cropHeight;
  171. outUVStart = outYStart >> 2;
  172. outUVSize = outYSize >> 2;
  173. printf("Input size %ux%u, output size %ux%un",
  174. frameWidth, frameHeight, frameWidth, cropHeight);
  175. planeBuf = (u_int8_t *)malloc(inYSize);
  176. while (!feof(inFile)) {
  177. int i, rc;
  178. frameNumber++;
  179. rc = cropPlane(inYSize, outYStart, outYSize);
  180. switch (rc) {
  181. case 0:
  182. goto done;
  183. case -1:
  184. goto read_error;
  185. case -2:
  186. goto write_error;
  187. }
  188. for (i = 0; i < 2; i++) {
  189. rc = cropPlane(inUVSize, outUVStart, outUVSize);
  190. switch (rc) {
  191. case 0:
  192. case -1:
  193. goto read_error;
  194. case -2:
  195. goto write_error;
  196. }
  197. }
  198. }
  199. goto done;
  200. read_error:
  201. fprintf(stderr, 
  202. "%s: read error %s on frame %u: %sn",
  203. progName, inFileName, frameNumber, strerror(errno));
  204. goto done;
  205. write_error:
  206. fprintf(stderr, 
  207. "%s: write error %s on frame %u: %sn",
  208. progName, outFileName, frameNumber, strerror(errno));
  209. goto done;
  210. done:
  211. /* cleanup */
  212. fclose(inFile);
  213. fclose(outFile);
  214. return(0);
  215. }
  216. static int cropPlane(u_int32_t inSize, u_int32_t outOffset, u_int32_t outSize)
  217. {
  218. int rc;
  219. /* read Y plane */
  220. rc = fread(&planeBuf[0], sizeof(u_int8_t), inSize, inFile);
  221. if (rc == 0) {
  222. return 0;
  223. }
  224. if (rc != inSize) {
  225. return -1;
  226. }
  227. /* write cropped frame to output file */
  228. rc = fwrite(&planeBuf[outOffset], 1, outSize, outFile);
  229. if (rc != outSize) {
  230. return -2;
  231. }
  232. return 1;
  233. }