📄 parse_playback_cmdline.c
字号:
#define _LARGEFILE64_SOURCE 1 // Required for large files (> 4GB)#include "sample_os.h"#define ALLOW_OS_CODE 1#include "../rua/include/rua.h"#include "../dcc/include/dcc.h"#include "common.h"// to enable or disable the debug messages of this source file, put 1 or 0 below#if 0#define LOCALDBG ENABLE#else#define LOCALDBG DISABLE#endifextern int verbose_stdout;extern int verbose_stderr;RMbool manutest = FALSE;void show_playback_options(void){ fprintf(stderr, "PLAYBACK OPTIONS (default values inside brackets)\n" "\t-m chip: Selects the board number [0]\n" "\t-L count: Loops the file count times [1]\n" "\t-l: Loops the file infinitely [FALSE]\n" "\t-waitexit: application doesn't stop and exit until q key is pressed\n" "\t-data mode: selects which streams to send to decode: n,a,v,s (n=none) [avs]\n" "\t-ts mode: selects which streams to send PTS to decode: n,a,v,s (n=none) [avs]\n" "\t-save mode: selects which streams to save into file: n,a,v,s (n=none) [n]\n" "\t mode: avs, av, a, vs, v, n\n" "\t-savems mode: same as -save but outputs elementary file with embedded pts and frame_size data\n" "\t-speed N M: set the speed factor to N/M [1 1]\n" "\t-dram controller: sets the dram controller to use [0]\n" "\t-manutest: maunufacture testing mode\n" "\t-pause: starts playback in pause state\n" "\t-bcc filename: use the BCC file filename [NULL]\n" "\t-stcdrift: enable correction of STC-to-PCR drift (SPI only)\n" "\t-stcdbg n: level of debug print [0]..3\n" "\t-delay time: set delay in ms for audio, video timers relative to stc timer [0]\n" "\t-dmapool count log2_size: sets the count and the log2 size of the dma pool.\n" "\t Default is application dependent.\n" "\t-disk_ctrl level: minimum number of buffer when reactivation of disk must be done.\n" "\t-prebuf size: maximum size in kB read from media for prebuffering.\n" "\t-sat: send audio while in trickmodes [false]\n" "\t-past: play any supported track [disabled]; otherwise video track must have a known codec\n" "\t-noucode: do not load microcode [FALSE]\n" "\t-STCid value: selects the STC ID to use [0]\n" "\t-STC_initial_value value: sets STC initial value before reading stream (allows black frame in prebuffering mode)]\n" "\t-far <value>: fast audio recovery after trickmodes (performs a seek when resuming from trickmodes) [0] 1\n" "\t-dontSendMPEG4pts: dont send video pts for mpeg4/h264 encoded AVI files\n" );}static RMuint64 g_t = 0;static RMuint64 HDsleepTime = 0;static RMuint64 HDrunTime = 0;static RMstatus default_disk_ctrl_callback(const enum disk_control_action action){ RMuint64 t; RMuint64 diff; t = RMGetTimeInMicroSeconds(); if(!g_t) g_t = t; diff = t - g_t; fprintf(stderr, "---------------------------------------\n"); if(action == DISK_CONTROL_ACTION_SLEEP) { HDrunTime += diff; fprintf(stderr, "SLEEP!! SLEEP!! SLEEP!! SLEEP!! SLEEP!!\n"); fprintf(stderr, " wakeup time %10llu us\n\n", diff); } else { HDsleepTime += diff; fprintf(stderr, "WAKE UP!! WAKE UP!! WAKE UP!! WAKE UP!!\n"); fprintf(stderr, " sleep time %10llu us\n\n", diff); } fprintf(stderr, " total wakeup time %10llu us\n", HDrunTime); fprintf(stderr, " total sleep time %10llu us\n", HDsleepTime); if(HDrunTime) fprintf(stderr, " sleep/run ratio %10llu\n", HDsleepTime/HDrunTime); fprintf(stderr, "---------------------------------------\n"); fflush(stderr); g_t = t; return RM_OK;}RMstatus init_playback_options(struct playback_cmdline *options){ options->filename = NULL; options->duration = 0; options->chip_num = 0; options->noucode = FALSE; options->STCid = 0; options->STC_initial_value=0; options->loop_count = 1; options->infinite_loop = FALSE; options->waitexit = FALSE; options->send_audio = TRUE; options->send_video = TRUE; options->send_spu = TRUE; options->send_audio_pts = TRUE; options->send_video_pts = TRUE; options->send_spu_pts = TRUE; options->save_audio = FALSE; options->save_video = FALSE; options->save_spu = FALSE; options->savems = FALSE; options->speed_N = 1; options->speed_M = 1; options->f_video_data = -1; options->f_video_pts = -1; options->f_audio_data = -1; options->f_audio_pts = -1; options->f_spu_data = -1; options->f_spu_pts = -1; options->dram = 0; options->start_ms = 0; options->start_pause = FALSE; options->bcc_filename = NULL; options->video_byte_count = 0; options->audio_byte_count = 0; options->spu_byte_count = 0; options->stc_compensation = FALSE; options->stc_comp_debug = 0; options->require_video_audio = TRUE; options->audio_delay_ms = 0; options->video_delay_ms = 0; options->spi = FALSE; options->serial_spi = FALSE; options->dmapool_count = 0; options->dmapool_log2size = 0; options->prebuf_max = 0; options->disk_ctrl_state = DISK_CONTROL_STATE_DISABLE; options->disk_ctrl_low_level = 0; options->disk_ctrl_callback = default_disk_ctrl_callback; options->disk_ctrl_max_mem = 0; options->disk_ctrl_log2_block_size = 0; options->max_usable_RUA_mem = 0; options->send_audio_trickmode = FALSE; options->dontSendMPEG4pts = FALSE; options->fast_audio_recovery = TRUE; return RM_OK;}RMstatus parse_playback_cmdline(int argc, char **argv, int *index, struct playback_cmdline *options){ RMstatus err = RM_PENDING; int i = *index; RMDBGLOG((LOCALDBG, "parsing option[%lu]='%s'\n", i, argv[i])); if (! strcmp(argv[i], "-m")) { if (argc > i+1) { options->chip_num = strtol(argv[i+1], NULL, 10); i+=2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-L")) { if (argc > i+1) { options->loop_count = strtol(argv[i+1], NULL, 10); i+=2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-l")) { options->infinite_loop = TRUE; i++; err = RM_OK; } else if (! strcmp(argv[i], "-waitexit")) { options->waitexit = TRUE; i++; err = RM_OK; } else if (! strcmp(argv[i], "-noucode")) { options->noucode = TRUE; i++; err = RM_OK; } else if (! strcmp(argv[i], "-STCid")) { if (argc > i+1) { options->STCid = strtol(argv[i+1], NULL, 10); i += 2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-STC_initial_value")) { if (argc > i+1) { options->STC_initial_value = strtol(argv[i+1], NULL, 10); i += 2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-manutest")) { manutest = options->manutest = TRUE; verbose_stdout = verbose_stderr = 0; i++; err = RM_OK; } else if (! strcmp(argv[i], "-data")) { if (argc > i+1) { RMuint32 n = 0; options->send_audio = FALSE; options->send_video = FALSE; options->send_spu = FALSE; err = RM_OK; for (n=0 ; n<strlen(argv[i+1]) ; n++) { switch (argv[i+1][n]) { case 'a': options->send_audio = TRUE; break; case 'v': options->send_video = TRUE; break; case 's': options->send_spu = TRUE; break; case 'n': break; default: err = RM_ERROR; } } i += 2; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-ts")) { if (argc > i+1) { RMuint32 n = 0; options->send_audio_pts = FALSE; options->send_video_pts = FALSE; options->send_spu_pts = FALSE; err = RM_OK; for (n=0 ; n<strlen(argv[i+1]) ; n++) { switch (argv[i+1][n]) { case 'a': options->send_audio_pts = TRUE; break; case 'v': options->send_video_pts = TRUE; break; case 's': options->send_spu_pts = TRUE; break; case 'n': break; default: err = RM_ERROR; } } i += 2; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-save")) { if (argc > i+1) { RMuint32 n = 0; options->savems = FALSE; options->save_audio = FALSE; options->save_video = FALSE; options->save_spu = FALSE; err = RM_OK; for (n=0 ; n<strlen(argv[i+1]) ; n++) { switch (argv[i+1][n]) { case 'a': options->save_audio = TRUE; break; case 'v': options->save_video = TRUE; break; case 's': options->save_spu = TRUE; break; case 'n': break; default: err = RM_ERROR; } } i += 2; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-savems")) { if (argc > i+1) { RMuint32 n = 0; options->savems = FALSE; options->save_audio = FALSE; options->save_video = FALSE; options->save_spu = FALSE; err = RM_OK; for (n=0 ; n<strlen(argv[i+1]) ; n++) { switch (argv[i+1][n]) { case 'a': options->save_audio = TRUE; options->savems = TRUE; break; case 'v': options->save_video = TRUE; options->savems = TRUE; break; case 's': options->save_spu = TRUE; options->savems = TRUE; break; case 'n': break; default: err = RM_ERROR; } } i += 2; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-speed")) { if (argc > i+2) { options->speed_N = strtol(argv[i+1], NULL, 10); options->speed_M = strtol(argv[i+2], NULL, 10); i += 3; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-dram")) { if (argc > i+1) { options->dram = strtol(argv[i+1], NULL, 10); i += 2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-pause")) { options->start_pause = TRUE; i ++; err = RM_OK; } else if (! strcmp(argv[i], "-dontSendMPEG4pts")) { options->dontSendMPEG4pts = TRUE; i ++; err = RM_OK; } else if (! strcmp(argv[i], "-far")) { RMuint32 dummy; if (argc > i+1) { dummy = strtol(argv[i+1], NULL, 10); i += 2; if (!dummy) options->fast_audio_recovery = FALSE; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-bcc")) { if (argc > i+1) { options->bcc_filename = argv[i+1]; i += 2; err = RM_OK; } else { err = RM_ERROR; } } else if (! strcmp(argv[i], "-stcdrift")) { options->stc_compensation = TRUE; i ++; err = RM_OK; } else if (! strcmp(argv[i], "-stcdbg")) { if (argc > i+1) { options->stc_comp_debug = strtol(argv[i+1], NULL, 10); i += 2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-delay")) { if (argc > i+1) { options->video_delay_ms = strtol(argv[i+1], NULL, 10); options->audio_delay_ms = options->video_delay_ms; i += 2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-dmapool")) { if (argc > i+2) { options->dmapool_count = strtol(argv[i+1], NULL, 10); options->dmapool_log2size = strtol(argv[i+2], NULL, 10); i += 3; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-disk_ctrl")) { if (argc > i+1) { options->disk_ctrl_state = DISK_CONTROL_STATE_SLEEPING; options->disk_ctrl_low_level = strtol(argv[i+1], NULL, 10); i += 2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-prebuf")) { if (argc > i+1) { options->prebuf_max = strtol(argv[i+1], NULL, 10); options->prebuf_max *= 1024; i += 2; err = RM_OK; } else err = RM_ERROR; } else if (! strcmp(argv[i], "-sat")) { options->send_audio_trickmode = TRUE; i ++; err = RM_OK; } else if (! strcmp(argv[i], "-past")) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -