Adobe Premiere Pro导入插件开发遇到的一个问题

最近在更新公司一款Premiere Pro CC导入插件的时候,遇到了一个神奇的现象。具体的现象是这样的:我们的插件需要将一些私有的文件数据放到插件中,比如说当前活动的文件名。当插件中收到不同的selector时,我们能够随时获取到这些私有数据进行操作。具体来说,我们是在收到imGetPrefs8这个selector时,进行设置的。回调函数代码如下:

static prMALError
SDKGetPrefs8(
imStdParms			*stdParms,
imFileAccessRec8	*fileInfo8,
imGetPrefsRec		*prefsRec)
{
	//-----------------
	// The first time you are called (or if you‘ve been Quieted or Closed)
	// you will get asked for prefs data.  First time called, return the
	// size of the buffer you want Premiere to store prefs for your plug-in.

	// Note: if canOpen is not set to kPrTrue, I‘m not getting this selector. Why?
	// Answer: because this selector is associated directly with "hasSetup"

	if (prefsRec->prefsLength == 0) {
		prefsRec->prefsLength = sizeof(MediaSettings);
	}
	else {
		MediaSettings* settings = (MediaSettings*)prefsRec->prefs;
		//do not show dialog for the first time.
		if (fileInfo8->fileref != imInvalidHandleValue) {
			auto ctx = (FileContext*)(fileInfo8->fileref);
			if (!ctx || !ctx->media_source) {
				return malNoError;
			}
			auto oldSettings = ctx->media_source->GetMediaSettings();
			settings->layout = oldSettings.layout;
			settings->lock_direction = oldSettings.lock_direction;
			settings->use_flowstate = oldSettings.use_flowstate;
			settings->media_case = oldSettings.media_case;
			settings->need_update = !settings->need_update;
			std::string currentFile = ctx->media_source->GetFilePath();
            ctx->media_source->ShowSettingsDialog(settings, currentFile);
			updateSettingFromFile(settings);
			ctx->media_source->UpdateSettings(settings);
		}
		else {
			//init settings
			settings->use_flowstate = true;
		}
	}
	return malNoError;
}

  根据Adobe官方提供的文档说明,imGetPrefs8这个selector在文件导入的时候会连续发送两次。第一次调用回调函数是为了获取用户私有数据缓存区的大小,Host程序会给我们分配这么大的一块缓冲区。第二次调用的时候,这块缓冲区已经分配好了。我们只要往这块内存写入私有用户数据就行了。按道理说,这个过程非常清晰明了,不应该出现什么问题。可是在我实际调试的时候,弹窗获取到用户输入后,并没有马上生效!那么,我是怎么判断用户输入之后没有生效呢?一般来说,如果用户更改了什么设置,那么需要插件立即去调用SDKGetSourceVideo()函数的。

static
prMALError
SDKGetSourceVideo(
imStdParms *stdparms,
imFileRef    fileRef,
imSourceVideoRec *sourceVideoRec)
{
    int ret;

    ImporterLocalRec8H ldataH = reinterpret_cast<ImporterLocalRec8H>(sourceVideoRec->inPrivateData);
    ImporterLocalRec8Ptr localRecP = reinterpret_cast<ImporterLocalRec8Ptr>(*ldataH);

    // Get parameters for ReadFrameToBuffer()
    imFrameFormat* frameFormat = &sourceVideoRec->inFrameFormats[0];
    prRect theRect;
    if (frameFormat->inFrameWidth == 0 && frameFormat->inFrameHeight == 0)
    {
        frameFormat->inFrameWidth = localRecP->theFile.width;
        frameFormat->inFrameHeight = localRecP->theFile.height;
    }
    // Windows and MacOS have different definitions of Rects, so use the cross-platform prSetRect
    prSetRect(&theRect, 0, 0, frameFormat->inFrameWidth, frameFormat->inFrameHeight);
    localRecP->PPixCreatorSuite->CreatePPix(sourceVideoRec->outFrame, PrPPixBufferAccess_ReadWrite, frameFormat->inPixelFormat, &theRect);
    csSDK_int32 theFrame = static_cast<csSDK_int32>(sourceVideoRec->inFrameTime / (*ldataH)->theFile.frameRate);
    FileContext* ctx = (FileContext*)(localRecP)->fileRef;
    if (ctx == nullptr) {
        return imNoContent;
    }

    ...
    ...

    return imNoErr;
}

这个函数负责根据当用的用户设置来重新生成一帧数据传递给Host程序渲染,这样用户才能实时看到设置生效了。问题是,我们的用户输入改变之后,SDKGetSourceVideo()这个方法并没有再次调用!那是什么原因导致的呢?难道是Premiere主程序有什么Bug?经过不断调试才发现,这个锅Premiere不能背啊!原因是,我在imGetPrefs8的回调函数中并没有修改私有数据。也就是说,在上面的SDKGetPrefs8()方法中,我通过prefsRec获取到用户私有数据缓冲区之后,如果没有修改过这块内存区的数据的话,Premiere会认为不需要重新渲染画面,也就不会再次调用SDKGetSourceVideo()方法了。

MediaSettings* settings = (MediaSettings*)prefsRec->prefs;

这么看来,Premiere的这个机制还是有道理的。如果用户私有数据没有更改,很大可能是不需要重新渲染画面的。这在某些计算频繁的场景下可能能够提供一定的性能提升。但是在文档里面并没有注明这一点。所以实际上,这个现象看起来像是一个锅实际上并不是一个锅……

原文地址:https://www.cnblogs.com/csuftzzk/p/adobe_premiere_pro_importer.html

时间: 2024-08-30 15:13:50

Adobe Premiere Pro导入插件开发遇到的一个问题的相关文章

Pr预设怎么安装?luts预设如何导入pr?Adobe Premiere Pro CC导入LUTs预设详细教程

Adobe Premiere Pro CC是适用于电影.电视和Web的领先视频编辑软件.相信很多小伙伴都喜欢用它来创造独特的视频,那么怎样才可以快速的导入luts预设呢?今天小编就来和大家分享lut预设导入pr2019 mac版的具体教程,想要学习的朋友不要错过哦! 软件地址:Adobe Premiere Pro CC 2019 for Mac v13.1.2中文激活版 luts预设导入pr 打开pr软件,如图依次点击. 点完[浏览...]后会弹出一个窗口,选择你要用的调色预设就可以了(这里以V

Adobe Premiere Pro生成峰值文件假死

一.正文 使用Adobe的Premiere Pro CC进行视频剪辑制作的时候,有的时候在右下角总会出现一个“自动生成峰值文件”的提示符,并跟随一个进度条: 大部分时候,这并不会引起什么问题.虽然我也不知道峰值文件具体是干什么的,生成的peak file又存在什么位置.但是一直以来也是相安无事.但是最近在编辑一个视频的时候,这个进度条总卡在开始的位置.并且视频多播放几次之后,整个Premiere就会处于假死崩溃的状态.后来在网上找到一个解决办法: 按图中所示,只要取消“自动生成音频波形”这个选项

Premiere Pro CC 2018中文破解版 64位

Premiere Pro CC 2018中文破解版:http://www.3322.cc/soft/35722.htmlPremiere Pro CC 2018是一款知名的编辑画面质量比较好的视频编辑软件,它可以帮助用户提升自己的创作能力和创作自由度,具有易学.高效.精确的优点,可为用户提供采集.剪辑.调色.美化音频.字幕添加.输出.DVD刻录一整套的操作流程,并可和其他Adobe软件完美兼容,以此来让用户足以完成在编辑.制作.工作流上遇到的所有挑战,并可满足用户创建高质量作品的要求.PreMi

Mac OS平台的Premiere Pro怎样配置首选项设置(一)?

Premiere Pro CC 2018 Mac版是一款编辑画面质量比较好的软件,有较好的兼容性,且可以与adobe公司推出的其他软件相互协作!小编今天就此款软件的"首选项配置"问题,为大家详细讲解一下.了解如何针对几个方面(从外观到播放.音频以及更多)配置首选项设置,充分利用 Premiere Pro 的功能. 您可以自定义 Premiere Pro 的外观和行为,从确定过渡的默认长度到设置用户界面的亮度.其中大部分首选项一直有效,直至更改它们.但是,为暂存盘设置的首选项将随项目一起

Mac OS平台的Premiere Pro怎样配置首选项设置(二)?

Adobe Premiere Pro CC 2018 Mac版是Adobe为Mac OS平台推出的一款常用的视频编辑软件,Adobe Premiere Pro CC 2018 Mac版是一款编辑画面质量比较好的软件,有较好的兼容性,且可以与adobe公司推出的其他软件相互协作,小编今天就此款软件的"首选项配置"问题,为大家详细讲解一下. 采集首选项 控制Premiere Pro直接从磁带盒或摄像机传输视频和音频的方式.(任何其他项目设置选项都不影响采集.)此面板的内容取决于编辑模式.如

完美:adobe premiere cs6破解版下载[序列号+汉化包+破解补丁+破解教程]

原文地址:http://blog.sina.com.cn/s/blog_6306f2c60102f5ub.html 完美:adobe premiere cs6破解版下载,含序列号.汉化包.注册机.破解补丁与破解教程 adobe premiere cs6简介: Adobe出品全球顶级视频编辑创作软件Premiere Pro CS6 采用了全新的64bit技术,在加快你工作效率的同时,保持了Adobe Encore CS6一一贯的稳定性. Adobe Premiere Pro cs6属目前最高版本,

Premiere Pro CC 2018破解文件下载

Adobe Premiere Pro CC 2018破解补丁 http://www.3322.cc/soft/37691.html premiere pro cc 2018破解补丁使用方法 1.首先先断开网络,之后运行"Set-up.exe"登录账号,并正确安装好premiere pro cc 2018软件 2.然后打开premiere pro cc 2018破解文件,软件版本无需修改,直接点击"Install" 3.然后找到安装目录下的"amtlib.d

Premiere Pro 2020安装教程

先简单介绍一下 Premiere Pro 2020(下载链接可以在文末获取) Adobe Premiere Pro是目前最流行的非线性编辑软件,是数码视频编辑的强大工具,它作为功能强大的多媒体视频.音频编辑软件,应用范围不胜枚举,制作效果美不胜收,足以协助用户更加高效地工作.Adobe Premiere Pro以其新的合理化界面和通用高端工具,兼顾了广大视频用户的不同需求,在一个并不昂贵的视频编辑工具箱中,提供了前所未有的生产能力.控制能力和灵活性.Adobe Premiere Pro是一个创新

adobe 蛋疼的套装, 想安装一个Flash Professional CS6,标准版还没有...

产品比较 查看内容 查看各 Creative Suite 6 版本的组件. Design Standard Design & Web Premium Production Premium Master Collection 产品           Photoshop CS6           Photoshop Extended CS6           Illustrator CS6           InDesign CS6           Acrobat X Pro for C