?? parse_capture_cmdline.c
字號(hào):
/* * * Copyright (c) Sigma Designs, Inc. 2005. All rights reserved. * *//** @file parse_capture_cmdline.c @brief sample application to access the 86xx chip family @author Christian Wolff*/#include "sample_os.h"#define ALLOW_OS_CODE 1#include "../rua/include/rua.h"#include "../dcc/include/dcc.h"#include "../rmcore/include/rmstatustostring.h"#include "common.h"#define SCANPARAM(x, msg, skip)\do {\ argi++;\ if (argi < argc) {\ param = strtoul(argv[argi], &endptr, 0);\ if (endptr[0] == '\0') x = param;\ else {\ RMDBGPRINT((ENABLE, msg " after %s\n", argv[argi - skip]));\ err = RM_ERROR;\ }\ } else {\ RMDBGPRINT((ENABLE, "Please specify %d number%s after %s\n", skip, (skip == 1) ? "" : "s", argv[argi - skip]));\ err = RM_ERROR;\ }\} while(0)void show_capture_options(void){ fprintf(stderr, "CAPTURE INPUT OPTIONS\n"); fprintf(stderr, " note: video input can capture video at 8 or 16 bit,\n"); fprintf(stderr, " graphic input can capture video at 8 or 16 bit, or graphics at 24 and 32 bit\n"); fprintf(stderr, " -i <input>: input block, 'graphic', 'video' or 'colorbars' (default: video)\n"); fprintf(stderr, " -if <input format>: tv standard of the input, same list as -f option (default: ntsc)\n"); fprintf(stderr, " -prot <video protcol>: 656, 601 or 601v (with vvld signal) (default: 601)\n"); fprintf(stderr, " -bus <bus size>: 8, 16, 24 or 32, use 8/16 bit data bus for video capture, 8/16/24/32 bit for graphics capture (default: 8)\n"); fprintf(stderr, " -format <in_format>: bit size and pixel formatting for graphics capture\n"); fprintf(stderr, " 24_888 24_8565 24_5676 32_8888 16_565 16_1555 16_4444 31_7888 (default: 24_888)\n"); fprintf(stderr, " -inasp <x> <y>: picture aspect ratio of the input frame (default: 4 by 3)\n"); fprintf(stderr, " -inaspix <x> <y>: alternatively, pixel aspect ratio of the input frame (picture asp. is used by default)\n"); fprintf(stderr, " -in_deint: allow De-Interlacing (increases memory usage)\n"); fprintf(stderr, " -ics <cs>: color space of the input (default: yuv_601)\n"); fprintf(stderr, " yuv_601, yuv_709, rgb_0_255, rgb_16_235\n"); fprintf(stderr, " -scs <cs>: color space of the scaler, allows conversion on graphic input (default: same as -ics)\n"); fprintf(stderr, " yuv_601, yuv_709, rgb_0_255, rgb_16_235\n"); fprintf(stderr, " -disablescaler: don't connect capture input to scaler (useful for other usage of captured pics, for instance, capture_crc\n"); fprintf(stderr, " -ddr, -ddri: enable dual edge / double data rate mode\n"); fprintf(stderr, " ddr: LSB on positive edge, MSB on negative edge\n"); fprintf(stderr, " ddri: MSB on positive edge, LSB on negative edge\n"); fprintf(stderr, " ddrw: cature full 16 bit DDR instead of 12 bit video + 4 bit alpha\n"); fprintf(stderr, " -X <hor.shift> -Y <vert.shift>: shift input frame\n"); fprintf(stderr, " -over <top> <bottom> <left> <right>: over-scan the input on each edge by as many pixels\n"); fprintf(stderr, " -vbi <x> <y> <w> <h>: window of VBI data in the captured video (w in pixel)\n"); fprintf(stderr, " -vbiraw <top_start> <top_mask> <bot_start> <bot_mask>: capture raw VBI data from vertical blanking area\n"); fprintf(stderr, " -vbianc <w> <h> <y_top> <y_bot>: cature sliced VBI data (h lines with w bytes each, starting at line y_top in top fields and line y_bot in bottom fields) from horizontal blanking area (w in bytes, h in lines per field)\n"); fprintf(stderr, " -vbidma: Use DMA to retreive VBI data, instead of CPU copy (useful for TeleText)\n"); fprintf(stderr, " -TT: PAL TeleText shortcut for '-vbianc 52 18 5 5' (with 656 capture on EM8622 and up, use with -anc -vbidma)\n"); fprintf(stderr, " -CC: NTSC ClosedCaption shortcut for '-vbianc 12 3 16 17' (with 656 capture on EM8622 and up, use with -softcc608)\n"); fprintf(stderr, " -dram <x>: DRAM bank to be used for the capture buffer\n"); fprintf(stderr, " -invv: invert V-Sync of capture format\n"); fprintf(stderr, " -invh: invert H-Sync of capture format\n"); fprintf(stderr, " -v2: Use alternate input pads on lower 8 bits of the input\n"); fprintf(stderr, " -inpicovr <format> <width> <height>: Override displayed picture format with different pixel format and frame size.\n"); fprintf(stderr, " -freerun [0|1]: disable/enable free running audio capture (no more PTS to STC sync after initial delay enforcement)\n");}RMstatus init_capture_options( struct capture_cmdline *options){ options->TVStandard = EMhwlibTVStandard_Custom; // none options->guess = TRUE; // probe input sync params unless a standard is forced options->dram = 0; options->InputColorSpace = EMhwlibColorSpace_YUV_601; options->SurfaceColorSpace = EMhwlibColorSpace_None; options->SamplingMode = EMhwlibSamplingMode_422; options->ColorMode = EMhwlibColorMode_VideoInterleaved; options->InputColorFormat = EMhwlibInputColorFormat_16BPP_565; options->PictureAspectRatio.X = 4; options->PictureAspectRatio.Y = 3; options->PixelAspectRatio.X = 0; // disable options->PixelAspectRatio.Y = 0; // disable options->InputModuleID = DispVideoInput; options->DigitalTimingSignal = EMhwlibDigitalTimingSignal_601; options->UseVideoValid = FALSE; options->bussize = 8; options->DualEdge = FALSE; options->DualEdgeWidth = FALSE; options->DualEdgeInvert = FALSE; options->InvertVSync = FALSE; options->InvertHSync = FALSE; options->shift_x = 0; options->shift_y = 0; options->ov_top = 0; options->ov_bot = 0; options->ov_lft = 0; options->ov_rgt = 0; options->vbi_x = 0; options->vbi_y = 0; options->vbi_w = 0; options->vbi_h = 0; options->vbiraw_topstart = 0; options->vbiraw_topmask = 0; options->vbiraw_botstart = 0; options->vbiraw_botmask = 0; options->vbianc_enable = FALSE; options->vbianc_w = 0; options->vbianc_h = 0; options->vbianc_ytop = 0; options->vbianc_ybot = 0; options->vbi_buf = 0; options->vbi_size = 0; options->vbi_dma = FALSE; options->DeInt = FALSE; options->UseV2Pads = FALSE; options->disablescaler = FALSE; options->override.Enable = FALSE; options->override.ColorFormat = EMhwlibInputColorFormat_32BPP; options->override.Width = 0; options->override.Height = 0; options->audio_free_run = TRUE; // default: disable AV-Sync after audio passthrough has started up with the expected delay. This is necessary because the STC can not run syncronous to an external clock and the phantom PTS of the audio SO ucode lacks the precision for long time playback options->AudioGuardTime = 0; return RM_OK;}RMstatus parse_capture_cmdline( int argc, char **argv, int *index, struct capture_cmdline *options){ RMstatus err = RM_OK; int argi = *index; RMuint32 param; RMascii *endptr; if (argv[argi][0] == '-') { if (! strcmp(&(argv[argi][1]), "if")) { // TODO check if options == NULL argi++; if (argi < argc) { if (RMFAILED(GetTVStandard(argv[argi], &(options->TVStandard)))) { RMDBGPRINT((ENABLE, "unknown TV standard: %s %s!\n", argv[argi - 1], argv[argi])); err = RM_ERROR; } options->guess = FALSE; } else { RMDBGPRINT((ENABLE, "please specify a TV standard after -f\n")); err = RM_ERROR; } } else if (! strcmp(&(argv[argi][1]), "ics")) { argi++; if (argi < argc) { if (! strcmp(argv[argi], "yuv_601")) { options->InputColorSpace = EMhwlibColorSpace_YUV_601; } else if (! strcmp(argv[argi], "yuv_709")) { options->InputColorSpace = EMhwlibColorSpace_YUV_709; } else if (! strcmp(argv[argi], "xv_601")) { options->InputColorSpace = EMhwlibColorSpace_xvYCC_601; } else if (! strcmp(argv[argi], "xv_709")) { options->InputColorSpace = EMhwlibColorSpace_xvYCC_709; } else if (! strcmp(argv[argi], "rgb_0_255")) { options->InputColorSpace = EMhwlibColorSpace_RGB_0_255; } else if (! strcmp(argv[argi], "rgb_16_235")) { options->InputColorSpace = EMhwlibColorSpace_RGB_16_235; } else { RMDBGPRINT((ENABLE, "unknown ColorSpace: -ics %s!\n", argv[argi])); err = RM_ERROR; } } else { RMDBGPRINT((ENABLE, "please specify a ColorSpace after -ics\n")); err = RM_ERROR; } } else if (! strcmp(&(argv[argi][1]), "scs")) { argi++; if (argi < argc) { if (! strcmp(argv[argi], "yuv_601")) { options->SurfaceColorSpace = EMhwlibColorSpace_YUV_601; } else if (! strcmp(argv[argi], "yuv_709")) { options->SurfaceColorSpace = EMhwlibColorSpace_YUV_709; } else if (! strcmp(argv[argi], "xv_601")) { options->SurfaceColorSpace = EMhwlibColorSpace_xvYCC_601; } else if (! strcmp(argv[argi], "xv_709")) { options->SurfaceColorSpace = EMhwlibColorSpace_xvYCC_709; } else if (! strcmp(argv[argi], "rgb_0_255")) { options->SurfaceColorSpace = EMhwlibColorSpace_RGB_0_255; } else if (! strcmp(argv[argi], "rgb_16_235")) { options->SurfaceColorSpace = EMhwlibColorSpace_RGB_16_235; } else { RMDBGPRINT((ENABLE, "unknown ColorSpace: -scs %s!\n", argv[argi])); err = RM_ERROR; } } else { RMDBGPRINT((ENABLE, "please specify a ColorSpace after -scs\n")); err = RM_ERROR; } } else if (! strcmp(&(argv[argi][1]), "disablescaler")) { options->disablescaler = TRUE; } else if (! strcmp(&(argv[argi][1]), "inaspix")) { SCANPARAM(options->PixelAspectRatio.X, "please specify a number for pixel aspect x", 1); SCANPARAM(options->PixelAspectRatio.Y, "please specify a number for pixel aspect y", 2); options->PictureAspectRatio.X = 0; options->PictureAspectRatio.Y = 0; } else if (! strcmp(&(argv[argi][1]), "inasp")) { SCANPARAM(options->PictureAspectRatio.X, "please specify a number for picture aspect x", 1); SCANPARAM(options->PictureAspectRatio.Y, "please specify a number for picture aspect y", 2); options->PixelAspectRatio.X = 0; options->PixelAspectRatio.Y = 0; } else if (! strcmp(&(argv[argi][1]), "i")) { argi++; if (argi < argc) { if (argv[argi][0] == 'g') { options->InputModuleID = DispGraphicInput; } else if (argv[argi][0] == 'v') { options->InputModuleID = DispVideoInput; } else if (argv[argi][0] == 'c') { options->InputModuleID = DispColorBars; } else { RMDBGPRINT((ENABLE, "unknown input: %s\n", argv[argi])); err = RM_ERROR; } } } else if (! strcmp(&(argv[argi][1]), "ddri")) { options->DualEdge = TRUE; options->DualEdgeInvert = TRUE; } else if (! strcmp(&(argv[argi][1]), "ddrw")) { options->DualEdge = TRUE; options->DualEdgeWidth = TRUE; } else if (! strcmp(&(argv[argi][1]), "ddr")) { options->DualEdge = TRUE; } else if (! strcmp(&(argv[argi][1]), "bus")) { SCANPARAM(options->bussize, "please specify a bus size (8, 16, 24 or 32 bit)", 1); if (options->bussize == 24) options->bussize = 32; if ((options->bussize != 8) && (options->bussize != 16) && (options->bussize != 32)) { RMDBGPRINT((ENABLE, "ERROR: bus size must be 8, 16, 24 or 32 bit\n")); err = RM_ERROR; } } else if (! strcmp(&(argv[argi][1]), "format")) { argi++; if (argi < argc) { if (! strcmp(argv[argi], "24_888")) { options->InputColorFormat = EMhwlibInputColorFormat_24BPP; } else if (! strcmp(argv[argi], "24_8565")) { options->InputColorFormat = EMhwlibInputColorFormat_24BPP_8565; } else if (! strcmp(argv[argi], "24_5676")) { options->InputColorFormat = EMhwlibInputColorFormat_24BPP_5676; } else if (! strcmp(argv[argi], "32_8888")) { options->InputColorFormat = EMhwlibInputColorFormat_32BPP; } else if (! strcmp(argv[argi], "16_565")) { options->InputColorFormat = EMhwlibInputColorFormat_16BPP_565; } else if (! strcmp(argv[argi], "16_1555")) { options->InputColorFormat = EMhwlibInputColorFormat_16BPP_1555; } else if (! strcmp(argv[argi], "16_4444")) { options->InputColorFormat = EMhwlibInputColorFormat_16BPP_4444; } else if (! strcmp(argv[argi], "31_7888")) { options->InputColorFormat = EMhwlibInputColorFormat_31BPP_7888; } else { RMDBGPRINT((ENABLE, "unknown color format: %s!\n", argv[argi])); err = RM_ERROR; } } else { RMDBGPRINT((ENABLE, "please specify a color format after %s\n", argv[argi - 1])); err = RM_ERROR; } } else if (! strcmp(&(argv[argi][1]), "prot")) { argi++; if (argi < argc) { if (! strcmp(argv[argi], "601")) { options->DigitalTimingSignal = EMhwlibDigitalTimingSignal_601; options->UseVideoValid = FALSE; } else if (! strcmp(argv[argi], "601v")) { options->DigitalTimingSignal = EMhwlibDigitalTimingSignal_601; options->UseVideoValid = TRUE; } else if (! strcmp(argv[argi], "656")) { options->DigitalTimingSignal = EMhwlibDigitalTimingSignal_656; } else { RMDBGPRINT((ENABLE, "unknown protocol: %s!\n", argv[argi])); err = RM_ERROR; } } else { RMDBGPRINT((ENABLE, "please specify a video protocol after %s\n", argv[argi - 1])); err = RM_ERROR; } } else if (! strcmp(&(argv[argi][1]), "X")) { SCANPARAM(options->shift_x, "please specify a horizontal input frame shift", 1); } else if (! strcmp(&(argv[argi][1]), "Y")) { SCANPARAM(options->shift_y, "please specify a vertical input frame shift", 1); } else if (! strcmp(&(argv[argi][1]), "over")) { SCANPARAM(options->ov_top, "please specify a top value", 1); SCANPARAM(options->ov_bot, "please specify a bottom value", 2); SCANPARAM(options->ov_lft, "please specify a left value", 3); SCANPARAM(options->ov_rgt, "please specify a right value", 4); } else if (! strcmp(&(argv[argi][1]), "vbi")) { SCANPARAM(options->vbi_x, "please specify a x value", 1); SCANPARAM(options->vbi_y, "please specify a y value", 2); SCANPARAM(options->vbi_w, "please specify a w value", 3); SCANPARAM(options->vbi_h, "please specify a h value", 4); } else if (! strcmp(&(argv[argi][1]), "vbiraw")) { SCANPARAM(options->vbiraw_topstart, "please specify a topstart value", 1); SCANPARAM(options->vbiraw_topmask, "please specify a topmask value", 2); SCANPARAM(options->vbiraw_botstart, "please specify a botstart value", 3); SCANPARAM(options->vbiraw_botmask, "please specify a botmask value", 4); } else if (! strcmp(&(argv[argi][1]), "vbianc")) { SCANPARAM(options->vbianc_w, "please specify a w value", 1); SCANPARAM(options->vbianc_h, "please specify a h value", 2); SCANPARAM(options->vbianc_ytop, "please specify a ytop value", 3); SCANPARAM(options->vbianc_ybot, "please specify a ybot value", 4); options->vbianc_enable = TRUE; } else if (! strcmp(&(argv[argi][1]), "vbidma")) { options->vbi_dma = TRUE; } else if (! strcmp(&(argv[argi][1]), "TT")) { options->vbianc_w = 52; options->vbianc_h = 18; options->vbianc_ytop = 5; options->vbianc_ybot = 5; options->vbianc_enable = TRUE; } else if (! strcmp(&(argv[argi][1]), "CC")) { options->vbianc_w = 12; options->vbianc_h = 3; options->vbianc_ytop = 16; options->vbianc_ybot = 17; options->vbianc_enable = TRUE; } else if (! strcmp(&(argv[argi][1]), "in_deint")) { options->DeInt = TRUE; } else if (! strcmp(&(argv[argi][1]), "invv")) { options->InvertVSync = TRUE; } else if (! strcmp(&(argv[argi][1]), "invh")) { options->InvertHSync = TRUE; } else if (! strcmp(&(argv[argi][1]), "dram")) { SCANPARAM(options->dram, "please specify a DRAM bank value", 1); } else if (! strcmp(&(argv[argi][1]), "v2")) { options->UseV2Pads = TRUE; } else if (! strcmp(&(argv[argi][1]), "inpicovr")) { if (argi + 3 < argc) { options->override.Enable = TRUE; argi++; if (! strcmp(argv[argi], "24_888")) { options->override.ColorFormat = EMhwlibInputColorFormat_24BPP; } else if (! strcmp(argv[argi], "24_8565")) { options->override.ColorFormat = EMhwlibInputColorFormat_24BPP_8565; } else if (! strcmp(argv[argi], "24_5676")) { options->override.ColorFormat = EMhwlibInputColorFormat_24BPP_5676; } else if (! strcmp(argv[argi], "32_8888")) { options->override.ColorFormat = EMhwlibInputColorFormat_32BPP; } else if (! strcmp(argv[argi], "16_565")) {
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -