codec engine代码阅读七---codecs中的xDM,XDAIS函数解析

XDAIS标准,TI-DSP算法标准-中文版 XDAIS标准-中文版 TI公司发布的DSP算法标准,TMS320 DSP Algorithm Standard 详细介绍dsp算法与arm间的通信方式以及构架搭建过程 立即下载

原文地址:http://alphamailpost.blog.163.com/blog/static/20111808120127219515423/

http://www.usr.cc/thread-52053-1-2.html


写可以被CE使用的算法通常要实现XDAIS或xDM标准。xDM是XDAIS的扩展。xDM自己又包括八种接口,按音频,视频,图像,语音每个再分为编码器和解码器。xDM和XDAIS的关系如图所示。

XDAIS标准分为两个接口,一个是IALG和个是IMOD。其框架如图所示。而xDM则是在XDAIS的基础上增加了一个接口,其框架图如图所示。
首先我们要先了解xDAIS的ialg接口:
ialg接口有七个函数需要我们去实现,这个链接是七个函数的调用流程。这七个函数组成一个结构体称为ialgfxns.其结构原型为:

typedef struct IALG_Fxns { Void *implementationId; Void (*algActivate)(IALG_Handle); Int (*algAlloc)(const IALG_Params *, struct IALG_Fxns **, IALG_MemRec *); Int (*algControl)(IALG_Handle, IALG_Cmd, IALG_Status *); Void (*algDeactivate)(IALG_Handle); Int (*algFree)(IALG_Handle, IALG_MemRec *); Int (*algInit)(IALG_Handle, const IALG_MemRec *, IALG_Handle, const IALG_Params *); Void (*algMoved)(IALG_Handle, const IALG_MemRec *, IALG_Handle, const IALG_Params *); Int (*algNumAlloc)(Void); } IALG_Fxns;

有些时候其中的一些函数无需实现,但要赋值为NULL.结构体中只有第一个成员变量比较特殊,不是函数指针而是一个空指针,它的作用是唯一标识模块的实现,经常需要用到。

剩下定义的函数可以分为3类:

1.用于创建algAlloc()、初始化AlgInit()和删除algFree实例对象的函数。

2.算法处理的函数,包括:algActivate()和algDeactivate();

3.用于控制和重定位 实例对象的函数,包括:algControl()和algMoved()。

剩下的一个algNumAlloc()函数可在任何时候调用且值不变,主要是求得算法实例的需要分配的存储器数目。

按顺序逐一解释一下:

      1.algActivate()。


功能:在数据处理之前,实现 临时存储器的初始化。参数是算法实例的句柄IALG_Handle handle, 通过该句柄识别出算法需要的不同类型的缓冲,并完成相应的初始化。该函数是可选实现的,仅当在数据处理之前需要初始化时才实现,如不实现可置NULL,以下雷同。

       调用的前提:必须在algInit()成功之后才能调用;handle是一个有效的算法句柄;它不能抢占对象的其它方法;如果算法实现了IDMA2接口,则algActivate()必须在dmaInit()成功后调用。实现此函数之后,算法中所有方法都可使用。

       2.algAlloc()。

功能:得到算法对象对于存储器的需求情况。

第一个参数是指向用于创建算法对象的参数,如果为NULL则是默认参数,

第二个参数是输出参数,返回给父IALG函数;

第三个参数是一个存储器记录的表格。如果成功返回一个非0整数,这个整数说明表格中包含多少个有效项。

       调用前提:存储器表格中记录的个数不能少于algNmAlloc()返回值,params允许为空。

       3.algControl()。

功能:算法的控制和状态信息的提取。

第一个参数是算法实例的句柄,剩下的2个参数是算法特定的。返回值是IALG_EOK或是其它出错信息。这个函数实现是可选的,如不实现设置为空。

       调用条件:只能在algInit()后调用,handle是一个有效句柄,cmd的数值必须小于IALG_SYSCMD。

      4.algDeactivate()。
功能
:保存所有的持久数据到非临时存储器上。与algActivate()类似,在其之后只能调用algActive()或algFree()。

      5.algFree()

功能:获得算法的存储器资源。与algAlloc()类似,返回值是存储器表格的有效项数。存储器表格中包含所有传递给算法的指向缓冲的指针。

6.algInit()。


功能:初始化算法实例对象。

algInit()实现在运行阶段创建算法实例对象,在该函数成功返回后,算法实例对象才开始处理数据。

参数解释:

第一个参数是算法实例句柄,它指向一个初始化后的IALG_Obj结构,数值与memTab[0].base相同(看不明白先看下他们的数据结构);

第二个参数是存储器记录表格,有效记录项目数与algAlloc()相同;

第三个参数是另一个算法实例对象的句柄,通常为NULL,表示没有父对象存在;

最后一个是算法特定参数,可以为NULL。

     调用条件较复杂。。。。。。

    7. algMoved()。   

功能:重新定位算法实例的存储器资源。主要是当算法实例需要移动时调用,可选实现,不实现表明不可移动。参数与algInit()中一样。

     8. algNumAlloc()。

功能:返回需要的存储器数目。必须大于等于algAlloc()的返回值,可以在任何时刻调用,且值不变


本楼结合videnc_copy和viddec_copy中的代码详细介绍一下第一个函数algAlloc()。
2.algAlloc()。


功能:得到算法对象对于存储器的需求情况。

第一个参数是指向用于创建算法对象的参数,如果为NULL则是默认参数,

第二个参数是输出参数,返回给父IALG函数;

第三个参数是一个存储器记录的表格。如果成功返回一个非0整数,这个整数说明表格中包含多少个有效项。

       调用前提:存储器表格中记录的个数不能少于algNmAlloc()返回值,params允许为空。

/* * ======== VIDENCCOPY_TI_alloc ======== */ Int VIDENCCOPY_TI_alloc(const IALG_Params *algParams, IALG_Fxns **pf, IALG_MemRec memTab[]) { /* Request memory for my object 为对象申请内存 */ memTab[0].size = sizeof(VIDENCCOPY_TI_Obj);//设置内存表项的大小。 memTab[0].alignment = 0; //设置内存的对齐方式。 memTab[0].space = IALG_EXTERNAL;//设置请求的内存类型 memTab[0].attrs = IALG_PERSIST; //设置内存的属性 return (1); //只做了一个表项,返回一。 }

另一个,viddec_copy的内容是一样的:

/* * ======== VIDDECCOPY_TI_alloc ======== */ Int VIDDECCOPY_TI_alloc(const IALG_Params *algParams, IALG_Fxns **pf, IALG_MemRec memTab[]) { if (curTrace.modName == NULL) { /* initialize GT (tracing) */ GT_create(&curTrace, GTNAME); } GT_3trace(curTrace, GT_ENTER, "VIDDECCOPY_TI_alloc(0x%lx, 0x%lx, 0x%lx)\n", algParams, pf, memTab); /* Request memory for my object */ memTab[0].size = sizeof(VIDDECCOPY_TI_Obj); memTab[0].alignment = 0; memTab[0].space = IALG_EXTERNAL; memTab[0].attrs = IALG_PERSIST; return (1); }


然后我们还看algcontrol:这个函数在app中的app.c中被调用了,我们可以直接看看是怎么调用的:
status = VIDDEC_control(dec, XDM_GETSTATUS, &decDynParams, &decStatus);
参数:VIDDEC_Handle dec = VIDDEC_create(ce, decoderName, NULL);
dec是一个解码器实例的句柄。
XDM_GETSTATUS这个参数显然是描述控制动作是获得状态。
&decDynParams 动态参数
&decStatus 状态

关于这个函数的描述是:
第一个参数是算法实例的句柄,剩下的2个参数是算法特定的。返回值是IALG_EOK或是其它出错信息。这个函数实现是可选的,如不实现设置为空。

       调用条件:只能在algInit()后调用,handle是一个有效句柄,cmd的数值必须小于IALG_SYSCMD
实际上在xDM中control函数与ialg中的ialg_control还有些许不同,这里先不理,下面直接看实现代码:

/* * ======== VIDENCCOPY_TI_control ======== */ XDAS_Int32 VIDENCCOPY_TI_control(IVIDENC_Handle handle, IVIDENC_Cmd id, IVIDENC_DynamicParams *params, IVIDENC_Status *status) { XDAS_Int32 retVal; GT_4trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_control(0x%x, 0x%x, 0x%x, " "0x%x)\n", handle, id, params, status); /* validate arguments - this codec only supports "base" xDM. */ if ((params->size != sizeof(*params)) || (status->size != sizeof(*status))) { GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_control, unsupported size " "(0x%x, 0x%x)\n", params->size, status->size); return (IVIDENC_EFAIL); } switch (id) { //根据命令id来决定动作 case XDM_GETSTATUS: //获得状态 case XDM_GETBUFINFO: //获得缓冲区信息 status->extendedError = 0; status->bufInfo.minNumInBufs = MININBUFS; //填充状态的信息域 status->bufInfo.minNumOutBufs = MINOUTBUFS; status->bufInfo.minInBufSize[0] = MININBUFSIZE; status->bufInfo.minOutBufSize[0] = MINOUTBUFSIZE; retVal = IVIDENC_EOK; break; case XDM_SETPARAMS: //设定参数 case XDM_SETDEFAULT: //设为默认 case XDM_RESET: //复位 case XDM_FLUSH: //清空 /* TODO - for now just return success. 现在只是返回EOK*/ retVal = IVIDENC_EOK; break; default: /* unsupported cmd 如果是不支持的命令,则返回EFAIL*/ retVal = IVIDENC_EFAIL; break; } return (retVal); }


另一个和上面的区别不大,只是列出代码,不做过多解释,从这两个代里我们看到这里有一个很重要的东西就是status结构体:

/* * ======== VIDDECCOPY_TI_control ======== */ XDAS_Int32 VIDDECCOPY_TI_control(IVIDDEC_Handle handle, IVIDDEC_Cmd id, IVIDDEC_DynamicParams *params, IVIDDEC_Status *status) { XDAS_Int32 retVal; GT_4trace(curTrace, GT_ENTER, "VIDDECCOPY_TI_control(0x%lx, 0x%lx, 0x%lx, " "0x%lx)\n", handle, id, params, status); /* validate arguments - this codec only supports "base" xDM. */ if ((params->size != sizeof(*params)) || (status->size != sizeof(*status))) { GT_2trace(curTrace, GT_ENTER, "VIDDECCOPY_TI_control, unsupported size " "(0x%lx, 0x%lx)\n", params->size, status->size); return (IVIDDEC_EFAIL); } switch (id) { case XDM_GETSTATUS: status->extendedError = 0; status->outputHeight = 0; /* TODO */ status->outputWidth = 0; /* TODO */ status->frameRate = 0; /* TODO */ status->bitRate = 0; /* TODO */ status->contentType = 0; /* TODO */ status->outputChromaFormat = 0; /* TODO */ /* Note, intentionally no break here so we fill in bufInfo, too */ case XDM_GETBUFINFO: status->bufInfo.minNumInBufs = MININBUFS; status->bufInfo.minNumOutBufs = MINOUTBUFS; status->bufInfo.minInBufSize[0] = MININBUFSIZE; status->bufInfo.minOutBufSize[0] = MINOUTBUFSIZE; retVal = IVIDDEC_EOK; break; case XDM_SETPARAMS: case XDM_SETDEFAULT: case XDM_RESET: case XDM_FLUSH: /* TODO - for now just return success. */ retVal = IVIDDEC_EOK; break; default: /* unsupported cmd */ retVal = IVIDDEC_EFAIL; break; } return (retVal); }

楼上讲的control函数实际上并非ialg接口定义的ialgcontrol函数,而是xDM定义的control函数,xDM还定义了一个process函数,这个函数是ialg没有的.
简单 起见去掉里面的trace代码:

/* * ======== VIDDECCOPY_TI_process ======== */ XDAS_Int32 VIDDECCOPY_TI_process(IVIDDEC_Handle h, XDM_BufDesc *inBufs, XDM_BufDesc *outBufs, IVIDDEC_InArgs *inArgs, IVIDDEC_OutArgs *outArgs) {//传入参数五个//0-->IVIDDEC_Handle,即解码器实例句柄//1-->XDM_BufDesc *inBufs,一个xDM缓冲区描述符型的输入缓冲区//-1-->XDC_BufDesc *outBufs,一个xDM缓冲区描述符型的输出缓冲区//2-->IVIDDEC_InArgs型 传入参数//-2-->传出参数 XDAS_Int32 curBuf; XDAS_Int32 minSamples; /* 验证传入传出参数大小是否合法,不合法则返回失败*/ if ((inArgs->size != sizeof(*inArgs)) || (outArgs->size != sizeof(*outArgs))) { return (IVIDDEC_EFAIL); } /* outArgs->bytesConsumed reports the total number of bytes consumed */ outArgs->bytesConsumed = 0; //消耗的字节总数/* * A couple constraints for this simple "copy" codec:这个简单复制算法的限制 * - Given a different number of input and output buffers, only //给定一组不同输入和输出缓冲区数目 * decode (i.e., copy) the lesser number of buffers.//只解码较小数目的缓冲区 * - Given a different size of an input and output buffers, only//给定一组不同输出输入缓冲区大小 * decode (i.e., copy) the lesser of the sizes.//只解码较小大小的字节数 */ for (curBuf = 0; (curBuf < inBufs->numBufs) && (curBuf < outBufs->numBufs); curBuf++) {//for loop的条件:当前缓冲区序号同时小于输入和输出缓冲区数目 /* there's an available in and out buffer, how many samples? 给定一组输入输入缓冲区,用多少样本? */ minSamples = inBufs->bufSizes[curBuf] < outBufs->bufSizes[curBuf] ? inBufs->bufSizes[curBuf] : outBufs->bufSizes[curBuf]; //minSamples为inBufs结构的当前缓冲区大小和outBufs结构的当前缓冲区大小的最小值. /* process the data: read input, produce output 处理数扰,读输出,产生输出*/ memcpy(outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples); //纯的memcpy outArgs->bytesConsumed += minSamples;//消耗的字节数增加minSamples个字节. } /* Fill out the rest of the outArgs struct 复制完之后,填充outArgs结构的其他域*/ outArgs->extendedError = 0; outArgs->decodedFrameType = 0; /* TODO */ outArgs->outputID = inArgs->inputID; outArgs->displayBufs.numBufs = 0; /* important: indicate no displayBufs */ return (IVIDDEC_EOK);//返回成功 }

再看编码器的代码,里面涉及了一段涉及使用ACPY3的算法,这里先不理.
我们接着看这个代码在app.c中是怎么用的:

/* * Read complete frames from in, encode, decode, and write to out.*从输入文件读取,编码,再解编,写到输出 */ for (n = 0; fread(inBuf, IFRAMESIZE, 1, in) == 1; n++) {//for loop从输入文件每次读一帧 #ifdef CACHE_ENABLED #ifdef xdc_target__isaCompatible_64P /* * fread() on this processor is implemented using CCS's stdio, which * is known to write into the cache, not physical memory. To meet * xDAIS DMA Rule 7, we must writeback the cache into physical * memory. Also, per DMA Rule 7, we must invalidate the buffer's * cache before providing it to any xDAIS algorithm.*fread在这个处理器上的实现是通过CCS工具实现的.是读入cache的,不是物理内存,为*満足xDAIS DMA规则7,我们必须从cache中写加内存,而且必须验证cache,再提供给算法. */ Memory_cacheWbInv(inBuf, IFRAMESIZE); #else #error Unvalidated config - add appropriate fread-related cache maintenance #endif /* Per DMA Rule 7, our output buffer cache lines must be cleaned */ Memory_cacheInv(encodedBuf, EFRAMESIZE); #endif GT_1trace(curMask, GT_1CLASS, "App-> Processing frame %d...\n", n); /* encode the frame */ status = VIDENC_process(enc, &inBufDesc, &encodedBufDesc, &encInArgs, &encOutArgs);//这里是process函数,参数是编码器句柄,inBufDesc结构中有inBuf的指针,encodedBufDesc中有encodeBuf的指针,参数也是各自设置的. GT_2trace(curMask, GT_2CLASS, "App-> Encoder frame %d process returned - 0x%x)\n", n, status); #ifdef CACHE_ENABLED /* Writeback this outBuf from the previous call. Also, as encodedBuf * is an inBuf to the next process call, we must invalidate it also, to * clean buffer lines. */ Memory_cacheWbInv(encodedBuf, EFRAMESIZE); /* Per DMA Rule 7, our output buffer cache lines must be cleaned */ Memory_cacheInv(outBuf, OFRAMESIZE); #endif if (status != VIDENC_EOK) { GT_3trace(curMask, GT_7CLASS, "App-> Encoder frame %d processing FAILED, status = 0x%x, " "extendedError = 0x%x\n", n, status, encOutArgs.extendedError); break; }

补充代码:

/* clear and initialize the buffer descriptors */ memset(src, 0, sizeof(src[0]) * XDM_MAX_IO_BUFFERS); memset(encoded, 0, sizeof(encoded[0]) * XDM_MAX_IO_BUFFERS); memset(dst, 0, sizeof(dst[0]) * XDM_MAX_IO_BUFFERS); src[0] = inBuf; encoded[0] = encodedBuf; dst[0] = outBuf; inBufDesc.numBufs = encodedBufDesc.numBufs = outBufDesc.numBufs = 1; inBufDesc.bufSizes = inBufSizes; encodedBufDesc.bufSizes = encBufSizes; outBufDesc.bufSizes = outBufSizes; inBufSizes[0] = encBufSizes[0] = outBufSizes[0] = NSAMPLES; inBufDesc.bufs = src; encodedBufDesc.bufs = encoded; outBufDesc.bufs = dst;


CMOS反相器版图设计全解析:PMOS/NMOS布局与VDD/VSS连接门道 版图设计是芯片从电路原理图迈向物理实现的必经桥梁,而CMOS反相器作为最基础的数字单元,恰好是理解这一过程的最佳切入点。在版图绘制中,PMOS与NMOS因导电类型和迁移率差异,需要在N阱与P衬底上分别规划,并呈现出不同的有源区尺寸。真正决定版图好坏的关键,往往在于VDD/VSS的完整连接——不仅要接通源漏,还要通过阱接触和衬底接触固定阱与衬底电位,防止寄生PN结正偏和闩锁效应。合理布局电源地线轨道、优化接触孔数量,能显著降低寄生电阻与电迁移风险。这些原理不仅适用于反相器,也是所有CMOS数字标准单元版图设计 阅读详情

相关推荐

别再手动备份了!用Python脚本批量导出华为/华三交换机配置(附完整代码)

本文详细介绍了如何使用Python脚本实现华为/华三交换机配置的自动化备份,大幅提升网络运维效率。通过paramiko库建立SSH连接,结合pandas处理设备清单,实现配置的批量导出与规范化存储,解决传统手动备份耗时易错的问题。

weixin_28737603的博客 449

C学习:%p和%x、%lx、%hx、%llx区别辨析

%p和%x、%lx、%hx、%llx(对应int、long、short、long long)区别 总结: %p 可以匹配对应类型的指针地址,输出以16进制表示,会自带前缀0x %x 可以对应int类型的指针,输出以16进制输出,不会自带前缀0x 类似的,%lx,表示long类型指针,用16进制输出 分析: 当然,上面也可以用 %ld,表示将long类型的指针地址,强制用10进制输出 %x只对应输出进制类型,具体的指针地址输出需要根据指针类型加修饰符 %p就固定了用16进制,可以囊括不同类型的指针地址表达

来知晓的博客 4万+

【点云语义分割】Ubuntu20.04下RangeNet++环境配置与实战指南

本文详细介绍了在Ubuntu20.04系统下配置和运行RangeNet++点云语义分割模型的完整实战指南。内容涵盖从Cuda、cudnn到TensorRT的深度学习环境搭建,RangeNet++源码编译的详细步骤与常见问题解决,以及如何运行首个分割Demo并可视化结果。最后,还探讨了处理自定义点云数据格式和进行性能调优的进阶技巧,旨在帮助开发者和研究者快速部署并应用这一先进的点云语义分割技术。

rnn9storyteller的博客 516

C语言学习系列(一)数据类型

关键字介绍 基本数据类型由11个关键字组成:int、short、long、unsigned、char、float、dobule、_Bool、_Complex(复数)、_Imaginary(虚数) C 语言内置运算符 sizeof(),以字节为单位给出指定类型的大小。编译器可用%u 或%lu 打印。 int 类型 如何显示不同进制数字: 以十进制显示数字,使用%d; 以八进制显示数字,使用%o; ...

u014799068的博客 977

思科网络进阶——多生成树协议(MSTP)配置的一课一得

三、实验拓扑1)设计一个网络架构,要有核心层和接入层,都使用思科交换机。2)企业有4个部门,要求这四个部门都可以上网,但分属不同的VLAN中,这样今后可以做其它安全策略以确保网络安全,这些策略如今后学到的访问控制列表ACL。3)网络架构的设计要具有冗余,防止一条线路或一台设备终端导致的业务中断。4)由于硬件冗余而产生的环路要处理好,也就是要在逻辑上(或者说通过配置)防止物理环路的产生。5)不能因为防止物理环路而导致某端口没有流量,这样浪费端口资源及设备间互联的带宽资源。

zhu52010的博客 3398

4路QSFP28接口能玩出什么花样?基于璞致VU13P开发板的100G网络测试方案

本文详细介绍了基于璞致PZ-VU13P-KFB开发板构建100G网络测试方案的实战指南。该方案充分利用板载Xilinx Virtex UltraScale+ FPGA的强大算力与4路QSFP28接口,涵盖从光模块选型、Aurora协议配置、开源Corundum方案部署,到误码率测试及散热优化的全链路流程,为高速网络设备研发与验证提供了可靠的硬件平台。

cola5的博客 454

一个 C 语言 uint64_t 变量移位赋值问题

碰到一个问题: #include <stdio.h> #include <stdint.h> int main() { uint64_t a = 0; uint8_t b = 0xff; a = b << 24; printf("a = 0x%lx\\n", a); } 乍一看, a 的值应该是 0x0000 0000 ff00 0000, 然而在 X86_64 gcc 上 实际编译后,却是输出 0xffff ffff ff0

2114

ubuntu系统禁止/开启内核自动更新

内核自动更新会导致驱动和内核版本不对应,导致驱动无法使用,所以需要禁止自动更新内核。本文介绍ubuntu系统禁止/开启内核更新的方法。

m0_50105717的博客 5289

【转】gcc错误表

conversion from %s to %s not supported by iconv”iconv 不支持从 %s 到 %s 的转换” iconv_open”iconv_open” no iconv implementation, cannot convert from %s to %s”没有 iconv 的实现,无法从 %s 转换到 %s” character 0x%lx is...

tianqu307的博客 1286

Dify框架面试内容整理-如何进行Dify的二次开发?

无论是轻量修改界面,还是深度集成自定义模型、Agent、知识库,你都可以很方便地进行二次开发。,你可以基于它的开源架构对功能进行扩展、集成第三方服务、修改界面风格,甚至定制新的AI工作流程。前端:Node.js >= 16,React + TypeScript + Tailwind。接入自己的模型API(如:调用LLaMA、Baichuan、ChatGLM)。修改路径:/api/app/services/providers/可接入你自己的向量数据库(Qdrant、Milvus、FAISS)

不务正业的猿 2003

cesium加载geotiff的 四种方法

本文介绍了在Cesium中加载GeoTIFF数据的两种主要方法。首先解析了核心前置知识,包括坐标系匹配、数据类型区分和性能优化。方法1详细演示了如何将RGB影像GeoTIFF转换为Cesium影像图层,包含从数据解析到Canvas转换的完整代码流程。方法2则针对高程数据(DEM)处理,展示了前端直接解析构建地形网格的方案。文章提供了完整的代码示例和关键实现要点,适用于卫星影像、专题图和数字高程模型等多种GeoTIFF数据类型在三维场景中的可视化需求。

大剑师兰特的GIS世界 395

codec engine代码阅读七---codecs中的xDM,XDAIS函数解析(转)

http://www.usr.cc/thread-52053-1-2.html 写可以被CE使用的算法通常要实现XDAIS或xDM标准。xDM是XDAIS的扩展。xDM自己又包括八种接口,按音频,视频,图像,语音每个再分为编码器和解码器。xDM和XDAIS的关系如图所示。 XDAIS标准分为两个接口,一个是IALG和个是IMOD。其框架如图所示。而xDM则是在XDAIS的基

wzlang的专栏 970

ABAP CDS SELECT, parameters 全面解析:把参数化视图玩明白(含可运行示例)

这篇技术博客介绍了ABAP CDS中参数化视图的用法与实践。文章从业务需求出发,解释了参数化视图的必要性,并详细说明了语法规则、参数类型匹配、视图内部参数引用等关键点。重点展示了在JOIN和ASSOCIATION中传递参数的写法,提供了航线分析的完整业务案例和可运行代码示例。文章还总结了视图实体与DDIC视图的差异、会话变量使用技巧等实践要点,特别强调了JOIN中必须显式传参的语法要求。通过真实场景演示,帮助开发者掌握参数化CDS的高效应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 362

C语言初阶(四)进制

一.进制常量表示C语言不能直接表示二进制常量。八进制数字以开头,十六进制数字以或开头。 二.输入 输出 十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来: 区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上即可输出前缀...

m0_60288340的博客 699

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从xDAIS到API

<br />现代软件开发,已从上世纪的面向过程编程发展到当前的面向框架编程。软件开发经验已证明:框架话、模块化的开发方式可以极大的提高软件开发效率,提高代码质量及代码重用率。然而,在嵌入式编程中,由于长期缺乏完善的开发框架和可用的API,开发人员依旧利用C或汇编语言和底层硬件打交道,凡是亲力亲为,这必然会增加嵌入式开发的入门门槛,降低代码的重用性,甚至增加代码易集时的复制度(不过这些缺点,对于程序员来说确是好事,入门门槛高、开发复制意味着高付出高回报,不像现在桌面电脑端的开发,已经被人研究烂了,如果你不是超

yuyin86的专栏 1616

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Product 'XDAIS' v0.0 is not currently installed and no compatible version is available.

CCS当编译的时候会出现下面的错误提示。 Buildfile generation error occurred.. Product 'XDAIS' v0.0 is not currently installed and no compatible version is available. Please install this product or a compatible version. ...

无语僧 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【转】gcc编译错误表

conversion from %s to %s not supported by iconv” iconv 不支持从 %s 到 %s 的转换” iconv_open” iconv_open” no iconv implementation, cannot convert from %s to %s” 没有 iconv 的实现,无法从 %s 转换到 %s” character 0x%l

wdt3385的专栏 5279

【DSP】xDAIS算法标准

1. 简介 在安装DSP开发支持包时,有名为 “xdais_7_21_01_07”文件夹。 xDAIS全称: TMS320 DSP Algorithm Standard(算法标准)。 39条规则,15条指南。 参考文档。 参考文章。 2. 三个层次 3.接口 XDAIS Digital Media。 编解码引擎。VISA(Video,Image,Speech,Audio)。 4. 未完待续。。。

Kshine2017的博客 602

CCS6.0:XDAIS文件找不到需要安装插件的方法

CCS v8编写28335程序,编译出现没有安装'XDAIS' v1.0.0的错误,具体错误报告如下,已解决!!! - C2000™︎ 微控制器论坛 - C2000 微控制器 - E2E™ 设计支持 Product 'XDAIS' v1.0.0 is not currently installed and no compatible version is available. Please install this product or a compatible version. Build stopped

1490

移植EMCV到DM6467(3)——CCS调试XDAIS算法

1        使用eXpressDSP Component Wizard生成算法 为了简化xDAIS算法的开发步骤,我们可以使用eXpressDSP Component Wizard这个工具,在安装之后,它会出现在CCS的Tool菜单栏中,使用非常方便。eXpressDSPComponent Wizard通过图形化的配置界面引导用户一步一步地完成一个xDAIS算法模块的设计。在配置完成之后,

hyanglu1573的专栏 4048

关于xdais

一、对于 IALG 接口之理解 先说 XDAIS 算法标准,原本以为是类似 C 的语法标准,结果买了本书查了下才知道,这是一个实现标 准(个人定义,呵呵),不是定义算法该如何具体去写,而是定义了算法能做什么不能去做什么,好像 有 46 条规则,还在完善中。至于为什么要符合这个标准,是因为现在第三方厂家提供算法都是按照它来 写的,这样更方便系统集成(比如 TI 的某部分程序+你自己完成的某部

simple 1662

关于AUTOSAR 配置类和变体(Configuration Class & Variant)的理解

这个参数的配置类信息就是图1中的信息。在 Can 这个 模块(ECUC-MODULE-DEF) 中,有一个标签 <SUPPORTED-CONFIG-VARIANTS> , 定义了 Can 这个模块支持两种配置变体, VARIANT-POST-BUILD 和 VARIANT-PRE-COMPILE。换句话说,如果 Can 模块选择 Post-build 配置,CanFdPaddingValue 这个参数可以 Post-build 配置,可以 Link time 配置,也可以 Pre-compile 配置。

jack91620的博客 3261

虚拟地址向物理地址转换 笔记

逻辑地址--->线性地址又称虚拟地址--->物理地址 代码段是只读的、数据段是可写的、堆栈段是可增长的 回顾相关概念 在进程中,我们不直接对物理地址进行操作。CPU在运行时,指定的地址要经过MMU转换后才能访问到真正的物理内存。地址转换的过程分为两部分,分段和分页。分段机制简单点来讲就是将进程的代码、数据、栈分在不同的虚拟地址段上。从而避免进程间的互相影响,分段之前的地址我们称之为逻辑地址。 逻辑地址由两部分组成,高位的段选择符和低位的端内偏移。在分段时先用段选择符在相应的段描...

最初的梦想 2656
上一篇: codec engine代码阅读六---CE_DIR/examples/ti/sdo/ce/examles/apps/video_copy
下一篇: codec engine example各文件夹及包中各文件解析
July_Yang
博客等级 码龄15年 46粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值