搜索
aardio官方社区 门户 查看主题

求教回调函数的实现

发布者: zkpt | 发布时间: 2017-10-14 23:08| 查看数: 556| 评论数: 10|帖子模式

c代码实例
  1. int MyImemGetCallback (void *data,
  2. const char *cookie,
  3. int64_t *dts,
  4. int64_t *pts,
  5. unsigned *flags,
  6. size_t * bufferSize,
  7. void ** buffer)
  8. {
  9. static int64_t _dts = 0, _pts = 0;
  10. if (!g_isInit){
  11. /*load local file*/
  12. local = fopen(TestFile,"rb");
  13. if (!local){
  14. return true;
  15. }
  16. size_t count = fread(in_buffer,1,IMG_WIDTH*IMG_HEIGHT*4,local);
  17. *bufferSize = count;
  18. *buffer = in_buffer;
  19. g_isInit = true;
  20. *dts = _dts; *pts = _pts;
  21. _dts+=30; _pts+=30;
  22. return 0 ;
  23. }
  24. size_t count = fread(in_buffer,1,IMG_WIDTH*IMG_HEIGHT*4,local);
  25. *bufferSize = count;
  26. *buffer = in_buffer;
  27. *dts = _dts; *pts = _pts;
  28. _dts+=30; _pts+=30;
  29. if(count>0) {
  30. printf("read %d bytes\n",count);
  31. return 0;
  32. }else{
  33. return true; /*eof*/
  34. }
  35. }
复制代码

代码说明:
  1. \param[in] data Pointer to user-defined data, this is your data that
  2.     you set by passing the "--imem-data=<memory_address>" option when
  3.     initializing VLC instance.
  4.     \param[in] cookie A user defined string. This works the same way as
  5.     data, but for string. You set it by adding the "--imem-cookie=<your_string>"
  6.     option when you initialize VLC. Use this when multiple VLC instances are
  7.     running.
  8.     \param[out] dts The decode timestamp, value is in microseconds. This value
  9.     is the time when the frame was decoded/generated. For example, 30 fps
  10.     video would be every 33 ms, so values would be 0, 33333, 66666, 99999, etc.
  11.     \param[out] pts The presentation timestamp, value is in microseconds. This
  12.     value tells the receiver when to present the frame. For example, 30 fps
  13.     video would be every 33 ms, so values would be 0, 33333, 66666, 99999, etc.
  14.     \param[out] flags Unused,ignore.
  15.     \param[out] bufferSize Use this to set the size of the buffer in bytes.
  16.     \param[out] buffer Change to point to your encoded frame/audio/video data.
  17.         The codec format of the frame is user defined and set using the
  18.         "--imem-codec=<four_letter>," where 4 letter is the code for your
  19.         codec of your source data.
复制代码
请教后边4个参数写入数据 是这样的形式吗?
MyImemGetCallback = function(data,cookie,dts,pts,flags,bufferSize,buffer){
::CopyMemoryByStruct(dts,{long dts = 30},8)
::CopyMemoryByStruct(pts,{long pts = 30},8)
::CopyMemoryByStruct(bufferSize,{int pos = #s},4)
::CopyMemoryByStruct(buffer,{string x = s},4)
}


最新评论

Jacen.He 发表于 2017-10-15 02:32:50
回调函数中的输出参数,用&声明,例如:
MyImemGetCallback = raw.tocdecl( function(dts,bufferSize,buffer){

   
//使用返回值输出参数(有几个输出参数,增加几个返回值)
    return 0,dts,bufferSize,buffer
},
"int(long &dts,LONG &bufferSize,ptr &buffer)")

但是你要把参数声明为指针,再自己修改指针的值也是可以的,下面这样写:
MyImemGetCallback = raw.tocdecl( function(dts,bufferSize,buffer){

    raw.convert({long v = 123},dts);
},
"int(ptr dts,ptr bufferSize,ptr &buffer)")

用 raw.convert()函数直接写内存指针就可以。
zkpt 发表于 2017-10-15 15:23:52
感谢回复
再请教下
sprintf(imemGetArg, "--imem-get=%#p", MyImemGetCallback);
这里是把MyImemGetCallback的地址跟字符串连接起来
在aardio里是这样吗?
  1. getPointerStr = function(p){
  2.              return (string.replace(tostring(p),"pointer\: ","0X"))
  3. }
  4. fun_c = raw.toPointer(raw.tocdecl(MyImemGetCallback,"int(ptr,ptr,long &dts,long &pts,int &flags,long &bufferSize,ptr &buffer)"))
  5. imemGetArg = "--imem-get="+getPointerStr(fun_c)
复制代码

Jacen.He 发表于 2017-10-15 15:36:34
zkpt 发表于 2017-10-15 15:23
感谢回复
再请教下
sprintf(imemGetArg, "--imem-get=%#p", MyImemGetCallback);

这个写复杂了,指针地址你都取到了,tonumber(fun_c) 就可以转为数值了。

另外回调函数你要这样写:
callback = raw.tocdecl(callback,"int(ptr,ptr,long &dts,long &pts,int &flags,long &bufferSize,ptr &buffer)")

你需要保持callback这个变量有效,没有超出变量作用域。

你这样写:
raw.toPointer( raw.tocdecl(callback,"int(ptr,ptr,long &dts,long &pts,int &flags,long &bufferSize,ptr &buffer)") )

那么你的回调函数只是一个临时变量,在 raw.toPointer() 用完了以后就当垃圾销毁了。

如果你创建静态回调函数一定要注意这一点。
在aardio里任何东西都是可回收可被自动销毁的,函数指针也一样。

想一想你的函数都销毁了,API还在调用不存在的函数指针那会怎么样。
zkpt 发表于 2017-10-15 15:40:51
char   in_buffer[640*480*4];
sprintf(imemDataArg, "--imem-data=%#p", in_buffer);
这里的in_buffer的地址,在aardio里是这样吗?
  1. in_buffer = raw.buffer(640*480*4)
  2. raw.toPointer(in_buffer)//是这个地址吗?
复制代码



Jacen.He 发表于 2017-10-15 15:43:29
zkpt 发表于 2017-10-15 15:40
这里的in_buffer的地址,在aardio里是这样吗?

对,其实你在aardio里也可以直接调用C++的sprintf函数,
aardio可以支持cdecl调用约定,而且可以支持cdecl的不定参数( 类似 sprintf 这种函数 ),
例子:
import console;

::Msvcrt := ..raw.loadDll(
"Msvcrt.dll",,"cdecl");

var imemDataArg  = raw.buffer(500);
::Msvcrt.sprintf(imemDataArg,
"--imem-data=%#p", imemDataArg);


console.log( imemDataArg );
console.pause(
true);

aardio中类似的函数是 string.format() 函数,不过不支持%p,要转为数值
zkpt 发表于 2017-10-15 15:45:21

感谢回复,我再研究研究。谢谢
zkpt 发表于 2017-10-16 10:45:04
回调函数我定义成如下形式
GetCallback = raw.tocdecl(MyImemGetCallback,"int(ptr,ptr,ptr,ptr,ptr,ptr,ptr&)")
然后回调里写
MyImemGetCallback = function(data,cookie,dts,pts,flags,bufferSize,buffer){
        var length = f.handle.readBuffer(in_buffer,f.IMG_WIDTH*f.IMG_HEIGHT*4)

        raw.convert({long dts=f.dts},dts)
        raw.convert({long pts=f.pts},pts)
        raw.convert({long size=length},bufferSize)
        raw.convert({pointer p=raw.toPointer(in_buffer)},buffer)//这个地方是这样写吗?

        f.dts += 30
        f.pts += 30
        if(length) return 0;
        return true;  
}

最后一个参数 buffer 定义成ptr& 是个二级指针吗?
定义成 pointer跟ptr 有区别吗?
感谢回复~

Jacen.He 发表于 2017-10-16 10:48:48
zkpt 发表于 2017-10-16 10:45
回调函数我定义成如下形式
GetCallback = raw.tocdecl(MyImemGetCallback,"int(ptr,ptr,ptr,ptr,ptr,ptr,p ...

pointer跟ptr没有区别,
你这里已经是二级指针了(结构体也是指针),所以不需要定义为ptr &,去掉后面的&

你要注意一下他这个回调函数是不是跨线程,如果跨线程,要用thread下面的同名函数创建回调。

如果你有现成的C代码,有些C代码太多的,可以直接用C代码写成DLL再调用,不一定要用aardio写的
Jacen.He 发表于 2017-10-16 10:50:22
{pointer p=raw.toPointer(in_buffer)}
你并不需要这样写

直接写
{pointer p=in_buffer}

在涉及到API的编程中,指针会自动转换,raw.toPointer一般是不要随便调用的,你一旦拿到了指针,aardio就不负责了,所以这个函数要小心使用,尽量不要用。
zkpt 发表于 2017-10-16 10:58:19
感谢回复,我不会c……,我再研究研究,感谢

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-1-20 18:39 , Processed in 0.062500 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表