⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 play_demux.c

📁 Sample code for use on smp 863x processor.
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -