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

📄 mp4live.cpp

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 CPP
字号:
/*
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 * 
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 * 
 * The Original Code is MPEG4IP.
 * 
 * The Initial Developer of the Original Code is Cisco Systems Inc.
 * Portions created by Cisco Systems Inc. are
 * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
 * 
 * Contributor(s): 
 *		Dave Mackie		dmackie@cisco.com
 *		Bill May 		wmay@cisco.com
 */

#define DECLARE_CONFIG_VARIABLES 1
#include "mp4live.h"
#include "media_flow.h"
#include "video_v4l_source.h"
#include "audio_oss_source.h"
#include <getopt.h>

int main(int argc, char** argv)
{
	int rc;
	char* configFileName = NULL;
	bool automatic = false;
	bool headless = false;
	bool sdpOnly = false;
	extern int nogui_main(CLiveConfig* pConfig);
	extern int gui_main(int argc, char**argv, CLiveConfig* pConfig);

	// command line parsing
	while (true) {
		int c = -1;
		int option_index = 0;
		static struct option long_options[] = {
			{ "automatic", 0, 0, 'a' },
			{ "file", 1, 0, 'f' },
			{ "headless", 0, 0, 'h' },
			{ "sdp", 0, 0, 's' }, 
			{ "version", 0, 0, 'v' },
			{ NULL, 0, 0, 0 }
		};

		c = getopt_long_only(argc, argv, "af:hsv",
			long_options, &option_index);

		if (c == -1)
			break;

		switch (c) {
		case 'a':
			automatic = true;
			break;
		case 'f':	// -f <config-file>
			configFileName = stralloc(optarg);
			break;
		case 'h':
			headless = true;
			break;
		case 's':
			sdpOnly = true;
			break;
		case 'v':
			fprintf(stderr, "%s version %s\n", argv[0], VERSION);
			exit(0);
		case '?':
		default:
			fprintf(stderr, 
				"Usage: %s [-f config_file] [--automatic] [--headless]\n",
				argv[0]);
			exit(-1);
		}
	}

	char userFileName[MAXPATHLEN];
	char* home = getenv("HOME");
	if (home) {
		strcpy(userFileName, home);
		strcat(userFileName, "/.mp4live_rc");
	}

	CLiveConfig* pConfig = NULL;
	try {
		pConfig = new CLiveConfig(MyConfigVariables,
			sizeof(MyConfigVariables) / sizeof(SConfigVariable),
			home ? userFileName : NULL);

		if (configFileName) {
			pConfig->ReadFromFile(configFileName);
		} else {
			// read user config file if present
			pConfig->ReadDefaultFile();
		}

		pConfig->m_appAutomatic = automatic;

		extern bool PrintDebugMessages;
		PrintDebugMessages =
			pConfig->GetIntegerValue(CONFIG_APP_DEBUG);
	} 
	catch (CConfigException* e) {
		delete e;
	}

	// probe for capture cards
	if (!strcasecmp(pConfig->GetStringValue(CONFIG_VIDEO_SOURCE_TYPE),
	  VIDEO_SOURCE_V4L)) {
		CV4LVideoSource::InitialVideoProbe(pConfig);
	}

	// probe for sound card capabilities
	if (!strcasecmp(pConfig->GetStringValue(CONFIG_AUDIO_SOURCE_TYPE),
	  AUDIO_SOURCE_OSS)) {
		pConfig->m_audioCapabilities = new CAudioCapabilities(
			pConfig->GetStringValue(CONFIG_AUDIO_SOURCE_NAME));
	}

	pConfig->Update();

	// initialization done, time to execute

	// first case: just want to generate the SDP file
	if (sdpOnly) {
		rc = GenerateSdpFile(pConfig);
		delete pConfig;
		exit(rc);
	}

	// other cases:

	// attempt to exploit any real time features of the OS
	// will probably only succeed if user has root privileges
	if (pConfig->GetBoolValue(CONFIG_APP_REAL_TIME_SCHEDULER)) {
#ifdef _POSIX_PRIORITY_SCHEDULING
		// put us into the lowest real-time scheduling queue
		struct sched_param sp;
		sp.sched_priority = 1;
		if (sched_setscheduler(0, SCHED_RR, &sp) < 0) {
# ifdef DEBUG
			debug_message("Unable to set scheduling priority: %s",
				strerror(errno));
# endif
		}
#endif /* _POSIX_PRIORITY_SCHEDULING */
#ifdef _POSIX_MEMLOCK
		// recommendation is to reserve some stack pages
		u_int8_t huge[1024 * 1024];
		memset(huge, 1, sizeof(huge));

		// and then lock memory
		if (mlockall(MCL_CURRENT|MCL_FUTURE) < 0) {
# ifdef DEBUG
			debug_message("Unable to lock memory: %s", 
				strerror(errno));
# endif
		}
#endif /* _POSIX_MEMLOCK */
	}

#ifdef NOGUI
	rc = nogui_main(pConfig);
#else
	if (headless) {
		rc = nogui_main(pConfig);
	} else {
		// hand over control to GUI
		try {
			rc = gui_main(argc, argv, pConfig);
		}
		catch (void* e) {
			rc = -1;
		}
	}
#endif

	// save any changes to user config file
	if (configFileName == NULL) {
		pConfig->WriteToFile(pConfig->GetFileName());
	} else {
		free(configFileName);
	}

	if (pConfig->GetBoolValue(CONFIG_APP_REAL_TIME_SCHEDULER)) {
#ifdef _POSIX_MEMLOCK
		munlockall();
#endif /* _POSIX_MEMLOCK */
	}

	// cleanup
	delete pConfig;
	exit (rc);
}

int nogui_main(CLiveConfig* pConfig)
{
	if (!pConfig->GetBoolValue(CONFIG_AUDIO_ENABLE)
	  && !pConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) {
		return -1;
	}

	// override any configured value of preview
	bool previewValue =
		pConfig->GetBoolValue(CONFIG_VIDEO_PREVIEW);
	pConfig->SetBoolValue(CONFIG_VIDEO_PREVIEW, false);

	CAVMediaFlow* pFlow = new CAVMediaFlow(pConfig);

	pFlow->Start();

	sleep(pConfig->GetIntegerValue(CONFIG_APP_DURATION)
		* pConfig->GetIntegerValue(CONFIG_APP_DURATION_UNITS));

	pFlow->Stop();

	delete pFlow;

	pConfig->SetBoolValue(CONFIG_VIDEO_PREVIEW, previewValue);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -