亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? isma.cpp

?? AAC編解碼源碼
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*
 * 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. 2001.  All Rights Reserved.
 * 
 * Contributor(s): 
 *		Dave Mackie		  dmackie@cisco.com
 *              Alix Marchandise-Franquet alix@cisco.com
 */

#include "mp4common.h"

static u_int8_t BifsV2Config[3] = {
	0x00, 0x00, 0x60 // IsCommandStream = 1, PixelMetric = 1
};

void MP4File::MakeIsmaCompliant(bool addIsmaComplianceSdp)
{
	ProtectWriteOperation("MP4MakeIsmaCompliant");

	if (m_useIsma) {
		// already done
		return;
	}
	m_useIsma = true;

	// find first audio and/or video tracks

	MP4TrackId audioTrackId = MP4_INVALID_TRACK_ID;
	try {
		audioTrackId = FindTrackId(0, MP4_AUDIO_TRACK_TYPE);
	}
	catch (MP4Error* e) {
		delete e;
	}

	MP4TrackId videoTrackId = MP4_INVALID_TRACK_ID;
	try {
		videoTrackId = FindTrackId(0, MP4_VIDEO_TRACK_TYPE);
	}
	catch (MP4Error* e) {
		delete e;
	}

	u_int64_t fileMsDuration =
		ConvertFromMovieDuration(GetDuration(), MP4_MSECS_TIME_SCALE);

	// delete any existing OD track
	if (m_odTrackId != MP4_INVALID_TRACK_ID) {
		DeleteTrack(m_odTrackId);
	}

	AddODTrack();
	SetODProfileLevel(0xFF);

	if (audioTrackId != MP4_INVALID_TRACK_ID) {
		AddTrackToOd(audioTrackId);
	}

	if (videoTrackId != MP4_INVALID_TRACK_ID) {
		AddTrackToOd(videoTrackId);
	}

	// delete any existing scene track
	MP4TrackId sceneTrackId = MP4_INVALID_TRACK_ID;
	try {
		sceneTrackId = FindTrackId(0, MP4_SCENE_TRACK_TYPE);
	}
	catch (MP4Error *e) {
		delete e;
	}
	if (sceneTrackId != MP4_INVALID_TRACK_ID) {
		DeleteTrack(sceneTrackId);
	}

	// add scene track
	sceneTrackId = AddSceneTrack();
	SetSceneProfileLevel(0xFF);
	SetGraphicsProfileLevel(0xFF);
	SetTrackIntegerProperty(sceneTrackId, 
		"mdia.minf.stbl.stsd.mp4s.esds.decConfigDescr.objectTypeId", 
		MP4SystemsV2ObjectType);
	
	SetTrackESConfiguration(sceneTrackId, 
		BifsV2Config, sizeof(BifsV2Config));

	u_int8_t* pBytes = NULL;
	u_int64_t numBytes = 0;

	// write OD Update Command
	CreateIsmaODUpdateCommandFromFileForFile(
		m_odTrackId, 
		audioTrackId, 
		videoTrackId,
		&pBytes, 
		&numBytes);

	WriteSample(m_odTrackId, pBytes, numBytes, fileMsDuration);

	MP4Free(pBytes);
	pBytes = NULL;

	// write BIFS Scene Replace Command
	CreateIsmaSceneCommand(
		MP4_IS_VALID_TRACK_ID(audioTrackId), 
		MP4_IS_VALID_TRACK_ID(videoTrackId),
		&pBytes, 
		&numBytes);

	WriteSample(sceneTrackId, pBytes, numBytes, fileMsDuration);

	MP4Free(pBytes);
	pBytes = NULL;

	// add session level sdp 
	CreateIsmaIodFromFile(
		m_odTrackId, 
		sceneTrackId, 
		audioTrackId, 
		videoTrackId,
		&pBytes, 
		&numBytes);

	char* iodBase64 = MP4ToBase64(pBytes, numBytes);

	char* sdpBuf = (char*)MP4Calloc(strlen(iodBase64) + 256);

	if (addIsmaComplianceSdp) {
		strcpy(sdpBuf, "a=isma-compliance:1,1.0,1\015\012");
	}

	sprintf(&sdpBuf[strlen(sdpBuf)], 
		"a=mpeg4-iod: \042data:application/mpeg4-iod;base64,%s\042\015\012",
		iodBase64);

	SetSessionSdp(sdpBuf);

	VERBOSE_ISMA(GetVerbosity(),
		printf("IOD SDP = %s\n", sdpBuf));

	MP4Free(iodBase64);
	iodBase64 = NULL;
	MP4Free(pBytes);
	pBytes = NULL;
	MP4Free(sdpBuf);
	sdpBuf = NULL;
}

static void CloneIntegerProperty(
	MP4Descriptor* pDest, 
	MP4DescriptorProperty* pSrc,
	const char* name)
{
	MP4IntegerProperty* pGetProperty;
	MP4IntegerProperty* pSetProperty;

	pSrc->FindProperty(name, (MP4Property**)&pGetProperty);
	pDest->FindProperty(name, (MP4Property**)&pSetProperty);

	pSetProperty->SetValue(pGetProperty->GetValue());
} 

void MP4File::CreateIsmaIodFromFile(
	MP4TrackId odTrackId,
	MP4TrackId sceneTrackId,
	MP4TrackId audioTrackId, 
	MP4TrackId videoTrackId,
	u_int8_t** ppBytes,
	u_int64_t* pNumBytes)
{
	MP4Descriptor* pIod = new MP4IODescriptor();
	pIod->SetTag(MP4IODescrTag);
	pIod->Generate();

	MP4Atom* pIodsAtom = FindAtom("moov.iods");
	ASSERT(pIodsAtom);
	MP4DescriptorProperty* pSrcIod = 
		(MP4DescriptorProperty*)pIodsAtom->GetProperty(2);

	CloneIntegerProperty(pIod, pSrcIod, "objectDescriptorId");
	CloneIntegerProperty(pIod, pSrcIod, "ODProfileLevelId");
	CloneIntegerProperty(pIod, pSrcIod, "sceneProfileLevelId");
	CloneIntegerProperty(pIod, pSrcIod, "audioProfileLevelId");
	CloneIntegerProperty(pIod, pSrcIod, "visualProfileLevelId");
	CloneIntegerProperty(pIod, pSrcIod, "graphicsProfileLevelId");

	// mutate esIds from MP4ESIDIncDescrTag to MP4ESDescrTag
	MP4DescriptorProperty* pEsProperty;
	pIod->FindProperty("esIds", (MP4Property**)&pEsProperty);
	pEsProperty->SetTags(MP4ESDescrTag);

	MP4IntegerProperty* pSetProperty;
	MP4IntegerProperty* pSceneESID;
	MP4IntegerProperty* pOdESID;

	// OD
	MP4Descriptor* pOdEsd =
		pEsProperty->AddDescriptor(MP4ESDescrTag);
	pOdEsd->Generate();

	pOdEsd->FindProperty("ESID", 
		(MP4Property**)&pOdESID);

	// we set the OD ESID to a non-zero unique value
	pOdESID->SetValue(m_odTrackId);

	pOdEsd->FindProperty("URLFlag", 
		(MP4Property**)&pSetProperty);
	pSetProperty->SetValue(1);

	u_int8_t* pBytes;
	u_int64_t numBytes;

	CreateIsmaODUpdateCommandFromFileForStream(
		audioTrackId, 
		videoTrackId,
		&pBytes, 
		&numBytes);

	VERBOSE_ISMA(GetVerbosity(),
		printf("OD data =\n"); MP4HexDump(pBytes, numBytes));

	char* odCmdBase64 = MP4ToBase64(pBytes, numBytes);

	char* urlBuf = (char*)MP4Malloc(strlen(odCmdBase64) + 64);

	sprintf(urlBuf, 
		"data:application/mpeg4-od-au;base64,%s",
		odCmdBase64);

	MP4StringProperty* pUrlProperty;
	pOdEsd->FindProperty("URL", 
		(MP4Property**)&pUrlProperty);
	pUrlProperty->SetValue(urlBuf);

	VERBOSE_ISMA(GetVerbosity(),
		printf("OD data URL = \042%s\042\n", urlBuf));

	MP4Free(odCmdBase64);
	odCmdBase64 = NULL;
	MP4Free(pBytes);
	pBytes = NULL;
	MP4Free(urlBuf);
	urlBuf = NULL;

	MP4DescriptorProperty* pSrcDcd = NULL;

	// HACK temporarily point to scene decoder config
	FindProperty(MakeTrackName(odTrackId, 
		"mdia.minf.stbl.stsd.mp4s.esds.decConfigDescr"),
		(MP4Property**)&pSrcDcd);
	ASSERT(pSrcDcd);
	MP4Property* pOrgOdEsdProperty = 
		pOdEsd->GetProperty(8);
	pOdEsd->SetProperty(8, pSrcDcd);

	// bufferSizeDB needs to be set appropriately
	MP4BitfieldProperty* pBufferSizeProperty = NULL;
	pOdEsd->FindProperty("decConfigDescr.bufferSizeDB",
		(MP4Property**)&pBufferSizeProperty);
	ASSERT(pBufferSizeProperty);
	pBufferSizeProperty->SetValue(numBytes);

	// SL config needs to change from 2 (file) to 1 (null)
	pOdEsd->FindProperty("slConfigDescr.predefined", 
		(MP4Property**)&pSetProperty);
	pSetProperty->SetValue(1);


	// Scene
	MP4Descriptor* pSceneEsd =
		pEsProperty->AddDescriptor(MP4ESDescrTag);
	pSceneEsd->Generate();

	pSceneEsd->FindProperty("ESID", 
		(MP4Property**)&pSceneESID);
	// we set the Scene ESID to a non-zero unique value
	pSceneESID->SetValue(sceneTrackId);

	pSceneEsd->FindProperty("URLFlag", 
		(MP4Property**)&pSetProperty);
	pSetProperty->SetValue(1);

	CreateIsmaSceneCommand(
		MP4_IS_VALID_TRACK_ID(audioTrackId), 
		MP4_IS_VALID_TRACK_ID(videoTrackId),
		&pBytes, 
		&numBytes);

	VERBOSE_ISMA(GetVerbosity(),
		printf("Scene data =\n"); MP4HexDump(pBytes, numBytes));

	char *sceneCmdBase64 = MP4ToBase64(pBytes, numBytes);

	urlBuf = (char*)MP4Malloc(strlen(sceneCmdBase64) + 64);
	sprintf(urlBuf, 
		"data:application/mpeg4-bifs-au;base64,%s",
		sceneCmdBase64);

	pSceneEsd->FindProperty("URL", 
		(MP4Property**)&pUrlProperty);
	pUrlProperty->SetValue(urlBuf);

	VERBOSE_ISMA(GetVerbosity(),
		printf("Scene data URL = \042%s\042\n", urlBuf));

	MP4Free(sceneCmdBase64);
	sceneCmdBase64 = NULL;
	MP4Free(urlBuf);
	urlBuf = NULL;
	MP4Free(pBytes);
	pBytes = NULL;

	// HACK temporarily point to scene decoder config
	FindProperty(MakeTrackName(sceneTrackId, 
		"mdia.minf.stbl.stsd.mp4s.esds.decConfigDescr"),
		(MP4Property**)&pSrcDcd);
	ASSERT(pSrcDcd);
	MP4Property* pOrgSceneEsdProperty = 
		pSceneEsd->GetProperty(8);
	pSceneEsd->SetProperty(8, pSrcDcd);

	// bufferSizeDB needs to be set
	pBufferSizeProperty = NULL;
	pSceneEsd->FindProperty("decConfigDescr.bufferSizeDB",
		(MP4Property**)&pBufferSizeProperty);
	ASSERT(pBufferSizeProperty);
	pBufferSizeProperty->SetValue(numBytes);

	// SL config needs to change from 2 (file) to 1 (null)
	pSceneEsd->FindProperty("slConfigDescr.predefined", 
		(MP4Property**)&pSetProperty);
	pSetProperty->SetValue(1);


	// finally get the whole thing written to a memory 
	pIod->WriteToMemory(this, ppBytes, pNumBytes);


	// now carefully replace esd properties before destroying
	pOdEsd->SetProperty(8, pOrgOdEsdProperty);
	pSceneEsd->SetProperty(8, pOrgSceneEsdProperty);
	pSceneESID->SetValue(0); // restore 0 value
	pOdESID->SetValue(0);

	delete pIod;

	VERBOSE_ISMA(GetVerbosity(),
		printf("IOD data =\n"); MP4HexDump(*ppBytes, *pNumBytes));
}

void MP4File::CreateIsmaIodFromParams(
	u_int8_t videoProfile,
	u_int32_t videoBitrate,
	u_int8_t* videoConfig,
	u_int32_t videoConfigLength,
	u_int8_t audioProfile,
	u_int32_t audioBitrate,
	u_int8_t* audioConfig,
	u_int32_t audioConfigLength,
	u_int8_t** ppIodBytes,
	u_int64_t* pIodNumBytes)
{
	MP4IntegerProperty* pInt;
	u_int8_t* pBytes = NULL;
	u_int64_t numBytes;

	// Create the IOD
	MP4Descriptor* pIod = new MP4IODescriptor();
	pIod->SetTag(MP4IODescrTag);
	pIod->Generate();
	
	// Set audio and video profileLevels
	pIod->FindProperty("audioProfileLevelId", 
		(MP4Property**)&pInt);
	pInt->SetValue(audioProfile);

	pIod->FindProperty("visualProfileLevelId", 
		(MP4Property**)&pInt);
	pInt->SetValue(videoProfile);

	// Mutate esIds from MP4ESIDIncDescrTag to MP4ESDescrTag
	MP4DescriptorProperty* pEsProperty;
	pIod->FindProperty("esIds", (MP4Property**)&pEsProperty);
	pEsProperty->SetTags(MP4ESDescrTag);

	// Add ES Descriptors

	// Scene
	CreateIsmaSceneCommand(
		(audioProfile != 0xFF),
		(videoProfile != 0xFF),
		&pBytes, 
		&numBytes);

	VERBOSE_ISMA(GetVerbosity(),
		printf("Scene data =\n"); MP4HexDump(pBytes, numBytes));

	char* sceneCmdBase64 = MP4ToBase64(pBytes, numBytes);

	char* urlBuf = 
		(char*)MP4Malloc(strlen(sceneCmdBase64) + 64);
	sprintf(urlBuf, 
		"data:application/mpeg4-bifs-au;base64,%s",
		sceneCmdBase64);

	VERBOSE_ISMA(GetVerbosity(),
		printf("Scene data URL = \042%s\042\n", urlBuf));

	/* MP4Descriptor* pSceneEsd = */
		CreateESD(
			pEsProperty,
			201,				// esid
			MP4SystemsV2ObjectType,
			MP4SceneDescriptionStreamType,
			numBytes,			// bufferSize
			numBytes * 8,		// bitrate
			BifsV2Config,
			sizeof(BifsV2Config),
			urlBuf);

	MP4Free(sceneCmdBase64);
	sceneCmdBase64 = NULL;
	MP4Free(urlBuf);
	urlBuf = NULL;
	MP4Free(pBytes);
	pBytes = NULL;

    // OD
    
	// Video
	MP4DescriptorProperty* pVideoEsdProperty =

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
裸体在线国模精品偷拍| 色婷婷狠狠综合| 欧美精品一区二区不卡| 秋霞国产午夜精品免费视频| 欧美日韩一级大片网址| 免费在线观看不卡| 26uuu欧美| 成人v精品蜜桃久久一区| 亚洲精品乱码久久久久| 欧美性猛片xxxx免费看久爱| 偷拍自拍另类欧美| 欧美不卡一区二区三区| www.性欧美| 美女一区二区在线观看| 欧美精品一区二区久久久| 国产成人午夜99999| 日韩一区在线看| 在线综合视频播放| 成人国产在线观看| 亚洲自拍另类综合| 国产午夜精品美女毛片视频| 色婷婷综合久久久中文一区二区| 亚洲va韩国va欧美va精品| 亚洲欧美一区二区视频| 丝袜美腿亚洲综合| 91麻豆精品国产91久久久久久| 国产美女主播视频一区| 一区二区三区美女视频| 精品国产3级a| 欧美伦理电影网| 91国产精品成人| 风间由美中文字幕在线看视频国产欧美 | 亚洲成年人影院| 欧美日本在线看| caoporn国产一区二区| 精品亚洲成a人| 九九**精品视频免费播放| 久久亚洲精精品中文字幕早川悠里 | 午夜精品一区二区三区免费视频| 久久综合九色综合欧美98| 5月丁香婷婷综合| 色诱亚洲精品久久久久久| 在线视频国产一区| 国产成人免费av在线| 经典一区二区三区| 国产毛片一区二区| 国产精品一二二区| 国产suv精品一区二区6| 国产成人午夜视频| 粉嫩绯色av一区二区在线观看| 免费成人美女在线观看.| 亚洲一区二区精品久久av| 夜夜精品视频一区二区| 亚洲综合一区二区| 亚洲综合色视频| 久久99国产乱子伦精品免费| 国产一区二区看久久| 成人深夜福利app| 色婷婷激情综合| 欧美电影免费观看高清完整版在| 精品久久久久香蕉网| 欧美国产日韩一二三区| 一区二区三区日韩精品视频| 轻轻草成人在线| 成人app在线| 欧美一区午夜精品| 国产精品久久久久久久浪潮网站| 一区二区三区国产精品| 国模娜娜一区二区三区| 色94色欧美sute亚洲13| 欧美日韩国产精品成人| 欧美精品一区二| 亚洲第一久久影院| 国产成人在线看| 欧美极品美女视频| 一区二区三区四区亚洲| 国内久久精品视频| 色94色欧美sute亚洲线路二| 国产亚洲一本大道中文在线| 婷婷一区二区三区| 色综合久久88色综合天天免费| 欧美一级高清大全免费观看| 亚洲精品久久久蜜桃| 成人av电影免费在线播放| 欧美va在线播放| 亚洲国产日日夜夜| 欧美中文字幕亚洲一区二区va在线 | 国产很黄免费观看久久| 欧美日韩精品一区二区三区四区 | 久久爱另类一区二区小说| 精品视频999| 亚洲国产毛片aaaaa无费看| 91在线无精精品入口| 欧美日韩国产另类不卡| 亚洲国产精品t66y| 精品国产亚洲一区二区三区在线观看 | 一区二区三区日韩| 色偷偷久久一区二区三区| 国产精品国产自产拍高清av王其| 国产精品综合av一区二区国产馆| 日韩精品中文字幕在线不卡尤物| 青青草视频一区| 日韩一区二区三区电影| 久久国产婷婷国产香蕉| 久久亚洲一区二区三区明星换脸| 激情小说亚洲一区| 国产午夜精品在线观看| 色婷婷综合五月| 亚洲福利视频导航| 精品国产露脸精彩对白| 国产精品一级二级三级| 日韩久久一区二区| 欧美一区二区三区在线看| 韩国成人在线视频| 亚洲视频一二三区| 91麻豆精品国产91久久久| 国产不卡一区视频| 亚洲国产cao| 国产精品久久久久久久久久免费看 | 波多野结衣视频一区| 洋洋成人永久网站入口| 国产亚洲综合性久久久影院| 欧美午夜片在线观看| 成人黄色电影在线| 另类欧美日韩国产在线| 一区二区三区**美女毛片| 精品免费国产二区三区| 777久久久精品| 欧美亚洲国产一卡| 在线观看亚洲a| 69堂精品视频| av一区二区三区四区| 久88久久88久久久| 视频一区视频二区中文| 伊人夜夜躁av伊人久久| 久久久久综合网| 久久免费看少妇高潮| 日韩欧美一区电影| 日韩一卡二卡三卡| 欧美一区二区三区四区高清| 91久久精品一区二区二区| 成人在线视频一区二区| 国产精品一级在线| 不卡的av中国片| 成人美女视频在线观看| 成人性色生活片免费看爆迷你毛片| 久久99精品久久久久久久久久久久| 天天av天天翘天天综合网色鬼国产| 亚洲一区在线看| 国产91清纯白嫩初高中在线观看| 欧美日韩国产一区二区三区地区| 国产一区二区三区视频在线播放| 日本91福利区| 久久国产三级精品| 激情综合五月婷婷| 国产精品资源在线观看| 成人黄色小视频| 在线播放中文一区| 精品日韩欧美在线| 中文字幕亚洲综合久久菠萝蜜| 1000部国产精品成人观看| 亚洲免费在线视频一区 二区| 亚洲成人午夜影院| 久久99精品久久久久久动态图| 国产盗摄精品一区二区三区在线| 色综合天天综合狠狠| 欧美网站大全在线观看| 精品欧美久久久| 亚洲国产日韩在线一区模特| 日本vs亚洲vs韩国一区三区二区| 国产精品影视在线| 欧美三级中文字幕| 亚洲男人的天堂在线aⅴ视频| 精品无人区卡一卡二卡三乱码免费卡| 成人美女视频在线观看18| 欧美日韩中文一区| 中文字幕一区二区视频| 老司机免费视频一区二区三区| 成人av小说网| 国产亚洲一区二区在线观看| 天堂影院一区二区| 成人av在线观| 18涩涩午夜精品.www| 国产成人av电影在线播放| 日韩欧美视频在线| 青青草一区二区三区| 欧美精品一二三| 亚洲国产成人高清精品| 99精品视频免费在线观看| 国产网站一区二区三区| 精彩视频一区二区| 久久综合精品国产一区二区三区 | 一区二区三区四区激情 | 欧美视频中文字幕| 亚洲一区在线播放| 欧美三级蜜桃2在线观看| 亚洲综合自拍偷拍| 欧美一区二区播放| 精品午夜一区二区三区在线观看| 欧美精品高清视频|