📄 play_demux.c
字号:
fprintf(stderr, " Stereo\n"); \ audio_opt->OutputDualMode = DualMode_Stereo; \ break; \ case DualMode_Stereo: \ fprintf(stderr, " LeftMono\n"); \ audio_opt->OutputDualMode = DualMode_LeftMono; \ break; \ default: \ fprintf(stderr, " Unknown dual mode\n"); \ break; \ } \ err = apply_audio_decoder_options_onthefly(&dcc_info,audio_opt); \ if (RMFAILED(err)) { \ fprintf(stderr, "Error applying audio decoder options on the fly %d\n", err); \ } \ } \} while (0)#define PROCESS_KEY_INSIDE_FUNCTION() \do { \ RMstatus err; \ enum RM_PSM_State PlaybackStatus; \ \ RMDBGLOG((KEYDBG, "processkey_inside_function\n")); \ err = process_command(pSendContext->PSMcontext, &(pSendContext->dcc_info), &actions); \ if (RMFAILED(err)) { \ RMDBGLOG((ENABLE, "Error while processing key %d\n", err)); \ goto return_from_callback; \ } \ PlaybackStatus = RM_PSM_GetState(pSendContext->PSMcontext, &(pSendContext->dcc_info)); \ if (actions.toDoActions & RM_PSM_RESYNC_TIMER) { \ RMDBGLOG((ENABLE, "resyncTimer\n")); \ SyncTimerWithDecoderPTS(pSendContext); \ actions.toDoActions &= ~RM_PSM_RESYNC_TIMER; \ } \ if ((actions.cmd == RM_QUIT) && (!actions.cmdProcessed)) { \ RMDBGLOG((ENABLE, "quit during callback\n")); \ pSendContext->ignoreCallback = TRUE; \ if (manutest == TRUE) \ manutest_res = RM_QUIT; \ goto return_from_callback; \ } \ if ((manutest == TRUE) && (actions.cmd == RM_MANU_QUIT_OK) && (!actions.cmdProcessed)) { \ RMDBGLOG((ENABLE, "quit during callback\n")); \ pSendContext->ignoreCallback = TRUE; \ if (manutest == TRUE) \ manutest_res = RM_MANU_QUIT_OK; \ goto return_from_callback; \ } \ if ((PlaybackStatus == RM_PSM_Stopped) && (actions.cmdProcessed)) { \ RMDBGLOG((ENABLE, "stop during callback\n")); \ pSendContext->ignoreCallback = TRUE; \ goto return_from_callback; \ } \ if ((actions.cmd == RM_STOP_SEEK_ZERO) && (!actions.cmdProcessed)) { \ RMDBGLOG((ENABLE, "seekzero during callback\n")); \ pSendContext->ignoreCallback = TRUE; \ goto return_from_callback; \ } \ if ((actions.cmd == RM_SEEK) && (!actions.cmdProcessed)){ \ RMDBGLOG((ENABLE, "seek during callback\n")); \ pSendContext->ignoreCallback = TRUE; \ goto return_from_callback; \ } \ if (((PlaybackStatus == RM_PSM_IForward) || \ (PlaybackStatus == RM_PSM_IRewind)) && (actions.cmdProcessed)) { \ RMDBGLOG((ENABLE, "iframe trick during callback\n")); \ pSendContext->ignoreCallback = TRUE; \ goto return_from_callback; \ } \ if (((PlaybackStatus == RM_PSM_Slow) || \ (PlaybackStatus == RM_PSM_Fast)) && (actions.cmdProcessed)) { \ RMDBGLOG((ENABLE,"trickmodes during callback\n")); \ pSendContext->isTrickMode = TRUE; \ pSendContext->ignoreCallback = FALSE; \ } \} while(0)#ifndef WITH_MONOstatic RMstatus parse_demux_type(char *demuxstr){ if ((bcmp(demuxstr, "mpeg1", 3)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is mpeg1 system\n"); demux_opt->system_type = RM_SYSTEM_MPEG1; return RM_OK; } if ((bcmp(demuxstr, "dvd", 3)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is vob\n"); demux_opt->system_type = RM_SYSTEM_MPEG2_DVD; return RM_OK; } if ((bcmp(demuxstr, "aob", 3)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is aob\n"); demux_opt->system_type = RM_SYSTEM_MPEG2_DVD_AUDIO; return RM_OK; } if ((bcmp(demuxstr, "m2t192", 6)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is m2t192\n"); demux_opt->system_type = RM_SYSTEM_MPEG2_TRANSPORT_192; return RM_OK; } if ((bcmp(demuxstr, "m2t", 3)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is m2t\n"); demux_opt->system_type = RM_SYSTEM_MPEG2_TRANSPORT; return RM_OK; } if ((bcmp(demuxstr, "m2p", 3)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is m2p\n"); demux_opt->system_type = RM_SYSTEM_MPEG2_PROGRAM; return RM_OK; } if ((bcmp(demuxstr, "vbs", 3)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is elementary video\n"); demux_opt->system_type = RM_SYSTEM_UNKNOWN; demux_opt->data_type = RMVDEMUX_VIDEO; return RM_OK; } if ((bcmp(demuxstr, "abs", 3)) == 0) { if (verbose_stderr != 0) fprintf(stderr, "file is elementary audio\n"); demux_opt->system_type = RM_SYSTEM_UNKNOWN; demux_opt->data_type = RMVDEMUX_AUDIO; return RM_OK; } return RM_ERROR;}static void show_usage(char *progname){ fprintf(stderr, "DEMUX OPTIONS (default values inside brackets)\n" "\t-y <demux type>: Selects the demux type\n" "\t\t[mpeg1], m2p, m2t, m2t192, dvd, vbs, abs, aob\n" "\t-vpid: video PID (else, first video stream will be played)\n" "\t-apid: audio PID (else, first audio stream will be played)\n" "\t-asubid: audio substream id (else, first audio substream will be played)\n" "\t-ssubid: spu substream id (else, first spu substream will be played)\n" "\t-z: Repacketizes packets (needed for transport streams) [FALSE]\n" "\t-spu: Enables subpicture [FALSE]\n" "\t-dur: Specifies the duration of the stream, on ms. Required for seeking\n" ); show_playback_options(); show_display_options(); show_video_options(); show_audio_options(); fprintf(stderr, "--------------------------------\n"); fprintf(stderr, "Minimum cmd line: %s <file name>\n", progname); fprintf(stderr, "--------------------------------\n"); exit(1);}static void parse_cmdline(int argc, char *argv[]){ int i; RMstatus err; /* init default demux_opt */ demux_opt->system_type = RM_SYSTEM_MPEG1; demux_opt->data_type = RMVDEMUX_VIDEO; demux_opt->repack_sample = FALSE; demux_opt->video_pid = 0; demux_opt->audio_pid = 0; demux_opt->audio_subid = 0; demux_opt->spu_subid = 0; if (argc < 2) show_usage(argv[0]); i = 1; while ((argc > i)) { if (argv[i][0] != '-') { if (play_opt->filename == NULL) { play_opt->filename = argv[i]; i++; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-y")) { if (argc > i+1) { err = parse_demux_type(argv[i+1]); if (RMFAILED(err)) show_usage(argv[0]); i+=2; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-z")) { demux_opt->repack_sample = TRUE; i++; } else if ( ! strcmp(argv[i], "-spu")) { enable_spu = TRUE; i++; } else if ( ! strcmp(argv[i], "-vpid")) { if (argc > i+1) { demux_opt->video_pid = strtol(argv[i+1], NULL, 0); i+=2; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-apid")) { if (argc > i+1) { /* permitted values should be 0xC0-0xDF, 0xBD, (decimal 192-223, 189) */ demux_opt->audio_pid = strtol(argv[i+1], NULL, 0); i+=2; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-asubid")) { if (argc > i+1) { demux_opt->audio_subid = strtol(argv[i+1], NULL, 0); i+=2; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-ssubid")) { if (argc > i+1) { demux_opt->spu_subid = strtol(argv[i+1], NULL, 0); i+=2; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-dur")) { if (argc > i+1) { play_opt->duration = strtol(argv[i+1], NULL, 10); i+=2; } else show_usage(argv[0]); } else { err = parse_playback_cmdline(argc, argv, &i, play_opt); if (err == RM_ERROR) show_usage(argv[0]); if (err != RM_PENDING) continue; err = parse_display_cmdline(argc, argv, &i, disp_opt); if (err == RM_ERROR) show_usage(argv[0]); if (err != RM_PENDING) continue; err = parse_video_cmdline(argc, argv, &i, video_opt); if (err == RM_ERROR) show_usage(argv[0]); if (err != RM_PENDING) continue; err = parse_audio_cmdline(argc, argv, &i, audio_opt); if (RMFAILED(err)) show_usage(argv[0]); } } if (play_opt->filename == NULL) show_usage(argv[0]); if (manutest == TRUE) { if (demux_opt->data_type == RMVDEMUX_VIDEO) { switch(disp_opt->connector) { case DCCVideoConnector_COMPOSITE: fprintf(stdout, "Please check Composite output .."); break; case DCCVideoConnector_COMPONENT: fprintf(stdout, "Please check Component output .."); break; case DCCVideoConnector_SVIDEO: fprintf(stdout, "Please check S-Video output .."); break; case DCCVideoConnector_DVI: fprintf(stdout, "Please check DVI-A output .."); break; case DCCVideoConnector_Digital: fprintf(stdout, "Please check DVI-D output .."); break; case DCCVideoConnector_VGA: fprintf(stdout, "Please check VGA output .."); break; case DCCVideoConnector_SCART: fprintf(stdout, "Please check SCART output .."); break; case DCCVideoConnector_LVDS: fprintf(stdout, "Please check LVDS output .."); break; default: fprintf(stdout, "Please check default output .."); break; } } else if (demux_opt->data_type == RMVDEMUX_AUDIO) { fprintf(stdout, "Please check audio output .."); } }}#endifstatic RMstatus Stop(struct demux_context * pSendContext, RMuint32 devices, enum DCCStopMode mode){ RMstatus err = RM_OK; struct dcc_context *dcc_info = pSendContext->dcc_info; if (devices & RM_DEVICES_VIDEO) { if (pSendContext->dcc_info->pVideoSource) { RMDBGLOG((ENABLE, "STOP: video decoder\n")); err = DCCStopVideoSource(dcc_info->pVideoSource, mode); if (RMFAILED(err)){ RMDBGLOG((ENABLE, "Error stopping video source %d\n", err)); return err; } pSendContext->initVideo = TRUE; } } if (devices & RM_DEVICES_AUDIO) { if (pSendContext->dcc_info->pAudioSource) { RMDBGLOG((ENABLE, "STOP: audio decoder\n")); err = DCCStopAudioSource(dcc_info->pAudioSource); if (RMFAILED(err)){ RMDBGLOG((ENABLE,"Error stopping audio source %d\n", err)); return err; } } } if ((devices & RM_DEVICES_AUDIO) && (devices & RM_DEVICES_VIDEO)) { pSendContext->FirstSystemTimeStamp = TRUE; } if (devices & RM_DEVICES_STC) { RMDBGLOG((ENABLE, "STOP: stc\n")); DCCSTCStop(dcc_info->pStcSource); } return err;}static RMstatus Play(struct demux_context * pSendContext, RMuint32 devices, enum DCCVideoPlayCommand mode){ RMstatus err = RM_OK; struct dcc_context *dcc_info = pSendContext->dcc_info; if (devices & RM_DEVICES_STC) { RMDBGLOG((ENABLE, "PLAY: stc\n")); DCCSTCPlay(dcc_info->pStcSource); } if (devices & RM_DEVICES_VIDEO) { if (pSendContext->dcc_info->pVideoSource) { if (pSendContext->initVideo) { RMbool keep_sequence = TRUE; RMDBGLOG((ENABLE, "PLAY: initDecoder\n")); err = RUASetProperty(pSendContext->dcc_info->pRUA, pSendContext->dcc_info->video_decoder, RMVideoDecoderPropertyID_StorePreviousVideoHeader, &keep_sequence, sizeof(keep_sequence), 0); if (RMFAILED(err)) { RMDBGLOG((ENABLE, "Error setting video decoder to keep sequence header on Stop %d\n", err)); return err; } pSendContext->initVideo = FALSE; } RMDBGLOG((ENABLE, "PLAY: video decoder %s\n", (mode == DCCVideoPlayIFrame ? "(iframe)":""))); err = DCCPlayVideoSource(pSendContext->dcc_info->pVideoSource, mode); if (RMFAILED(err)) { RMDBGLOG((ENABLE, "Cannot play video decoder %d\n", err)); return err; } } } if (devices & RM_DEVICES_AUDIO) { if (pSendContext->dcc_info->pAudioSource) { RMDBGLOG((ENABLE, "PLAY: audio decoder\n")); err = DCCPlayAudioSource(dcc_info->pAudioSource); if (RMFAILED(err)) { RMDBGLOG((ENABLE, "Cannot play video decoder %d\n", err)); return err;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -