捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:屏幕傳輸程序 (分塊+隔行掃描)
huangjian_w 32444 2007/12/28 18:29:59
也许我的网络速度不行,总是传不上来代码。就用ftp传到临时上传区了。
地址:ftp://uploads@uploads.2ccc.com/视频编解码代码.rar
谁的网速快,就代我上传吧(或者版主给改个路径),以便于大家研究。
基本实现了压缩和解压,但是还点问题。需要大家共同来研究,
压缩的视频流,在C:\test.mp4,可用附带解码软件查看,这个压缩仅仅是数据
没有mp4的文件头,如果带上文件头就被通用播放器查看。

里面用到DC-DSP组件,盒子论坛上有,主要用他来实现从摄像头捕获图像,进行压缩,其实也可以用vfw来抓屏,进行压缩。有兴趣的朋友自己试试。
guanyueguan 32443 2007/12/28 15:45:05
  就當作教學用吧,畢竟有需要而無時間的人(公司)基本是商業行為,我暫時還不想被應用在商業行為上,所以放棄了開源優化版本。優化版本也只是共享給好友而已,不是掐在手心。
  
  放2個改進的EXE目的也是激發有意向的人動動手,自己去掌握這個過時的技術,不存在吊胃口和顯擺的意思。只是我也是過來人,明白其中的辛苦,現在指個方向,方便後來人。
boatboy 32442 2007/12/28 14:35:07
不是不思考,看了楼主的Blog,发现楼主在屏传上做了相当多的研究,而且也花了相当多的时间,对楼主的兴趣激发出来的能量感到惊讶!不过像我这样没有很多时间花到研究屏传技术的研究上的人很多,而往往在实际中又需要用到这样的东西。其实自己很早以前就写过屏传的程序,当然没有做如此之多的优化,而楼主几次以吊胃口的方式在2ccc上发表屏传大作实在让人看得有点不舒服,我只是认为交流就要坦诚,而不是把程序质量改低了来交流,或许楼主没想来交流,只是来教学吧。我是有一说一,丝毫没有对楼主生意见,毕竟大家的行为都是自由,贡献甚至获取都是自愿的。
guanyueguan 32439 2007/12/28 9:48:17
編程是需要思考的!
如果你不願意思考就不用去思考(沒有誰強迫你),我發布這個主要是針對開發人員,不是為了拼拼湊湊。
boatboy 32438 2007/12/28 9:18:18
使用xdiv库,真是敢想!我觉得这是一条非常优秀的思路。
楼主说“小变化”可能是没有理解视频的概念,用xdiv就不存在分块比较之类的算法了。
另外,希望楼主把优化和没优化的代码都发上来,因为没有人喜欢去猜没有谜底的谜语。
swgame 32436 2007/12/27 20:56:22
你的DGScreenSpy_0.1.3.rar
在笔记本上试了下,CPU占用在40-50%之间,感觉是不错。
guanyueguan 32428 2007/12/26 13:57:33
打包時忘記把0.1.3的EXE文件放進支,
在0.1.2的基礎上改進的0.1.3的EXE文件:
DGScreenSpy_0.1.3.rar
http://www.91files.com/?T8SHDID01OG6ID9SWU8H
guanyueguan 32425 2007/12/26 11:32:02
1024*768*16的設定,30幀/秒,如果小變化CPU能控制在10%以內才可行。
huangjian_w 32423 2007/12/26 11:08:54
非常感谢wr960204,我也没任何介绍的资料,大家可以研究一下,应用成功,视频传输效率将大大提高,成功后我会发上源码。
huangjian_w 32421 2007/12/26 11:04:07
实现30帧/每秒,没有问题,如果大家要看Xvid源代码,可以在网上用Xivd搜,我发了几次都没有发上来。
wr960204 32419 2007/12/26 10:59:25
另外
http://blogimg.chinaunix.net/blog/upfile/070424110315.pdf
有XVID函数的详细介绍
huangjian_w 32418 2007/12/26 10:58:45
原始数据其实就是你的抓屏函数得到的bitmap,或者用 vfw的API函数从摄像头得到
的bitmap位图,你一秒钟抓30次(用定时器控制,每33毫秒抓一次)得到的位图自然
要在30毫秒内处理完毕,然后发送出去,否则对方收到一定会不连续。

至于性能,就目前我的笔记本而言,我用h.263(码率和比一般MPEG4差不多)压缩算法实现QQ摄像头网络视频传输,CPU不超过10%,可以达到每秒30%,很高的实时性。

如果我们可以用Xvid库实现编解码,那么做视频会议是很轻松的事情。
wr960204 32417 2007/12/26 10:53:27
Mpeg4这种压缩方式虽然体积小了,网络带宽节省了.但是压缩Mpeg4本身是十分耗费CPU的.可能得不偿失.
ysq8101 32416 2007/12/26 10:51:01
MPEG4的库效率还不错的,不过没压缩这么大的没试过。摄像头的一般不会超过15k/s
guanyueguan 32415 2007/12/26 10:16:19
我沒有了解MPEG4,所以也不明白它的工作方式:
1、原始數據幀如何獲取?
2、壓縮率與CPU消耗如何?

屏傳的關鍵不是壓縮!

其實這個程序效果並不怎麼樣(^_^我有意改差的),但是它隱藏了改進的方向,如果仔細分析的話是能夠發現的,只要改進好,和其它主流的程序會在同一個檔次的,當然該優化的地方也要優化才行,該用API的地方也得用API實現。
huangjian_w 32413 2007/12/26 9:49:09
如下代码是,编解码函数的调用,也许我输入参数有问题。想立即把来自摄像头的位图压缩为视频帧后,再解压显示出来,目前只研究到这个地方,还没有成功。
      SpBmp := TBitmap.Create;
      SpBmp.PixelFormat := pf24bit;
      SampleGrabber.GetBitmap(SpBmp, pBuffer, BufferLen); //捕获原始bmp位图
      //如果要直接显示 
      //Image.Picture.Graphic := SpBmp;
      yCount:=0;
      uCount:=0;
      vCount:=0;
      //转换RGB像素的位图矩阵,为YUV格式的矩阵
      for Row := 0 to SpBmp.Height - 1 do
      begin
         BmpLineData := Spbmp.ScanLine[Row]; //获取每行像素数据指针
         for Col:= 0 to SpBmp.Width -1 do
         begin
          YP[yCount] := Round(BmpLineData[Col].rgbtRed * 0.3 + BmpLineData[Col].rgbtGreen * 0.6 + BmpLineData[Col].rgbtBlue * 0.1);
          if Odd(Col) then //如果是偶数
          begin
          UP[uCount]:= Round(BmpLineData[Col].rgbtBlue * 0.4 - BmpLineData[Col].rgbtRed * 0.1 - BmpLineData[Col].rgbtGreen * 0.3);
          VP[vCount]:= Round(BmpLineData[Col].rgbtBlue * 0.6 - BmpLineData[Col].rgbtRed * 0.5 - BmpLineData[Col].rgbtGreen * 0.1);
          Inc(uCount,1);
          Inc(vCount,1);
          end;
          Inc(yCount,1);
         end;
      end;

      //图像压缩编码
      xvid_encStats.version := 1 SHL 16 + 1 SHL 8 + 0;
      FillChar(FrameBuf,SizeOf(FrameBuf),0);
      xvid_encFrame.bitstream := @FrameBuf[0];

      xvid_encFrame.input.plane[0] := @yp; //Y色度矩阵
      //xvid_encFrame.input.plane[1] := @up; //U色差Cr矩阵
      //xvid_encFrame.input.plane[2] := @vp; //V色差Cb矩阵
      xvid_encFrame.input.stride[0] := SpBmp.Width; //Y矩阵每行字节数
      //xvid_encFrame.input.stride[1] := SpBmp.Width div 2; //U矩阵每行字节数
      //xvid_encFrame.input.stride[2] := SpBmp.Width div 2; //V矩阵每行字节数

      xvid_encFrame.bframe_threshold :=0; //是否支持双向预测,PB模式


      xvid_encFrame.coding_type := XVID_TYPE_IVOP;  //I帧编码是关键帧,P帧编码是帧内预测

      //开始压缩
      Ret := xvid_encore(xvid_enc.handle, XVID_ENC_ENCODE, @xvid_encFrame, @xvid_encStats); //返回编码之后的字节
      if Ret > 0 then
      begin
        //FrameBuf的数组中存在Ret个数据就是编码的数据
        xvid_decFrame.bitstream := @FrameBuf; //解码数据流
        xvid_decFrame.length := Ret; //解码数据流长度
        xvid_decore(xVid_decode.handle , XVID_DEC_DECODE, @xvid_decFrame, @xvid_decStats);
        //xvid_decFrame.output.plane[0]
        //xvid_decFrame.output.plane[1]
        //xvid_decFrame.output.plane[2]

      end else begin
        //mmo1.Lines.Add('编码失败');
      end;
huangjian_w 32412 2007/12/26 9:44:20
我这两天没事也正在研究怎么使用这个库,如果成功,那将比其它算法更高效和快速。它可以实现标准的MPEG4,甚至支持,最好的视频压缩算法(目前H.264)。
下面就是我研究的部分使用过程。但是还是没有成功,发出来大家共同研究。
在Tform的 private定义私有变量,供主窗体全局使用。
    // XVID ENCODER
    xvid_gbl: xvid_gbl_init_t;
    xvid_enc: xvid_enc_create_t;
    xvid_encFrame: xvid_enc_frame_t;
    xvid_encStats: xvid_dec_stats_t;
    // XVID DECODER
    xVid_decode: xvid_dec_create_t;
    xvid_decFrame:xvid_dec_frame_t;
    xvid_decStats:xvid_dec_stats_t; 

  //如下代码供初始化编解码器使用
  try
      //XVID库初始化操作
      xvid_gbl.version := 1 SHL 16 + 1 SHL 8 + 0;    //Version:1.1.0,最新版本
      xvid_gbl.cpu_flags := 0; //0:自动检查CPU,XVID_CPU_FORCE:强制使用XVID指定特征的CPU 
      xvid_gbl.debug := 0;     //调试级别

      //初始化编码器,得到编码器句柄
      xvid_global(xvid_enc.handle, XVID_GBL_INIT, @xvid_gbl, nil);

      //初始化解码器
      xvid_global(xVid_decode.handle, XVID_GBL_INIT, @xvid_gbl, nil);

      // XVID编码器初始化
      xvid_enc.version := 1 SHL 16 + 1 SHL 8 + 0;
      //编码器参数
      xvid_enc.global := 0;   //全局标志
      xvid_enc.width := 320;  //压缩视频宽度
      xvid_enc.height := 240; //压缩视频高度
      xvid_enc.fbase := 25;   //基本帧率/每秒
      xvid_enc.fincr := 1;    //帧率增长步长,0:可变步长,>1实际增长步长
      xvid_enc.profile := XVID_PROFILE_AS_L4; //压缩级别,MPEG4-ASP最高压缩级别      
      xvid_enc.max_key_interval := 0;  //最大关键帧间隔
      xvid_enc.frame_drop_ratio := 0;  //丢帧率;0~100
      xvid_enc.max_bframes := 0; //是否采用B帧,一般采用I,P帧,如果1=PB帧

      //创建编码器
      xvid_encore(xvid_enc.handle, XVID_ENC_CREATE, @xvid_enc, nil);

      //初始化压缩数据帧结构
      xvid_encFrame.version := 1 SHL 16 + 1 SHL 8 + 0;

      // --- VOL FLAGS
      xvid_encFrame.vol_flags := 0;
      xvid_encFrame.vol_flags := xvid_encFrame.vol_flags OR XVID_VOL_MPEGQUANT;  //允许MPEG量化
      xvid_encFrame.vol_flags := xvid_encFrame.vol_flags OR XVID_VOL_GMC;        //允许GMC
      xvid_encFrame.vol_flags := xvid_encFrame.vol_flags OR XVID_VOL_QUARTERPEL; //采用1/4像素运算
      // --- VOP FLAGS
      xvid_encFrame.vop_flags := xvid_encFrame.vop_flags OR XVID_VOP_CHROMAOPT;  //允许色彩优化
      //xvid_encFrame.vop_flags := xvid_encFrame.vop_flags OR XVID_VOP_HALFPEL;    //允许半像素
      xvid_encFrame.motion := 0;  //运动标识
      xvid_encFrame.quant := 8; //质量控制=量化参数,1~31,数值越小质量越高
      //输入图像初始化
      xvid_encFrame.input.csp := XVID_CSP_BGR OR XVID_CSP_VFLIP; //24bit真彩色位图编码
      xvid_encFrame.input.stride[0] := xvid_enc.width; //每行多少个字节,一般为Width*3

      // XVID解码器初始化
      xVid_decode.version := 1 SHL 16 + 1 SHL 8 + 0;
      xVid_decode.width := 320;
      xVid_decode.height := 240;

      //创建解码器
      xvid_decore(xVid_decode.handle,XVID_DEC_CREATE,@xVid_decode, nil);
      //初始化解码数据帧结构
      xvid_decFrame.version := 1 SHL 16 + 1 SHL 8 + 0;
      xvid_decFrame.brightness := 0;     //亮度偏移
      xvid_decFrame.general := XVID_LOWDELAY; //低延时
      xvid_decFrame.output.csp := XVID_CSP_BGR OR XVID_CSP_VFLIP;
      xvid_decFrame.output.stride[0] := 320 * 240 * 3;
      xvid_decFrame.length := 0;
      // DECSTATS STRUCTURE INIT
      xvid_decStats.version := 1 SHL 16 + 1 SHL 8 + 0;
  except
    Exit;
  end;
huangjian_w 32411 2007/12/26 9:36:47
感谢LZ,最近我在看MPEG4压缩算法。发现如果用xvid库可以实现实时视频压缩。
当然我们的屏幕传输实际也是一种视频格式,只是把屏幕捕获的RGB位图转换
为YUV格式就可以了。不知道LZ研究过没有?xvid库就一个xvidcore.dll,是
开源的MPEG4压缩算法。
unit lib_xvid;

interface

uses
  Windows;

const
  XVID_DLL         = 'XVIDCORE.DLL';
  XVID_GBL_INIT    = 0;
  XVID_ERR_FAIL    = -1;
  XVID_ERR_MEMORY  = -2;  //* memory allocation error */
  XVID_ERR_FORMAT  = -3;  //* file format error */
  XVID_ERR_VERSION = -4;  //* structure version not supported */
  XVID_ERR_END    = -5;  //* encoder only; end of stream reached */
  XVID_ENC_CREATE  = 0;
  XVID_ENC_DESTROY = 1;
  XVID_ENC_ENCODE  = 2;
  XVID_DEC_CREATE  = 0;
  XVID_DEC_DESTROY = 1;
  XVID_DEC_DECODE  = 2;
  // FRAME TYPES
  XVID_TYPE_IVOP   = 1; //* intra frame */
  XVID_TYPE_PVOP   = 2; //* predicted frame */
  XVID_TYPE_BVOP   = 3; //* bidirectionally encoded */
  XVID_TYPE_SVOP   = 4; //* predicted+sprite frame */

  // DECODE COLORSPACE
  XVID_CSP_PLANAR   = $00000001; // (1<< 0) 4:2:0 planar (==I420, except for pointers/strides)
  XVID_CSP_I420     = $00000002; // (1<< 1) 4:2:0 planar
  XVID_CSP_YV12     = $00000004; // (1<< 2) 4:2:0 planar
  XVID_CSP_YUY2     = $00000008; // (1<< 3) 4:2:2 packed
  XVID_CSP_UYVY     = $00000010; // (1<< 4) 4:2:2 packed
  XVID_CSP_YVYU     = $00000020; // (1<< 5) 4:2:2 packed
  XVID_CSP_BGRA     = $00000040; // (1<< 6) 32-bit bgra packed
  XVID_CSP_ABGR     = $00000080; // (1<< 7) 32-bit abgr packed
  XVID_CSP_RGBA     = $00000100; // (1<< 8) 32-bit rgba packed
  XVID_CSP_BGR      = $00000200; // (1<< 9) 24-bit bgr packed
  XVID_CSP_RGB555   = $00000400; // (1<<10) 16-bit rgb555 packed
  XVID_CSP_RGB565   = $00000800; // (1<<11) 16-bit rgb565 packed
  XVID_CSP_SLICE    = $00001000; // (1<<12) decoder only: 4:2:0 planar, per slice rendering
  XVID_CSP_INTERNAL = $00002000; // (1<<13) decoder only: 4:2:0 planar, returns ptrs to internal buffers
  XVID_CSP_NULL     = $00004000; // (1<<14) decoder only: dont output anything
  XVID_CSP_ARGB     = $00008200; // (1<<15) 32-bit argb packed
  XVID_CSP_VFLIP    = $80000000; // (1<<31) vertical flip mask
  // DECODE GENERAL FLAGS
  XVID_LOWDELAY      = $0001;     // (1<<0) /* lowdelay mode  */
  XVID_DISCONTINUITY = $0002;     // (1<<1) /* indicates break in stream */
  XVID_DEBLOCKY      = $0004;     // (1<<2) /* perform luma deblocking */
  XVID_DEBLOCKUV     = $0008;     // (1<<3) /* perform chroma deblocking */
  XVID_FILMEFFECT    = $0010;     // (1<<4) /* adds film grain */
  XVID_DERINGUV      = $0020;     // (1<<5) /* perform chroma deringing, requires deblocking to work */
  XVID_DERINGY       = $0040;     // (1<<6) /* perform luma deringing, requires deblocking to work */
  XVID_DEC_FAST      = $20000000; // (1<<29) /* disable postprocessing to decrease cpu usage *todo* */
  XVID_DEC_DROP      = $40000000; // (1<<30) /* drop bframes to decrease cpu usage *todo* */
  XVID_DEC_PREROLL   = $80000000; // (1<<31) /* decode as fast as you can, don't even show output *todo* */
  // ENCODING PROFILES
  XVID_PROFILE_S_L0    = $08; //* simple */
  XVID_PROFILE_S_L1    = $01;
  XVID_PROFILE_S_L2    = $02;
  XVID_PROFILE_S_L3    = $03;
  XVID_PROFILE_ARTS_L1 = $91; //* advanced realtime simple */
  XVID_PROFILE_ARTS_L2 = $92;
  XVID_PROFILE_ARTS_L3 = $93;
  XVID_PROFILE_ARTS_L4 = $94;
  XVID_PROFILE_AS_L0   = $f0; //* advanced simple */
  XVID_PROFILE_AS_L1   = $f1;
  XVID_PROFILE_AS_L2   = $f2;
  XVID_PROFILE_AS_L3   = $f3;
  XVID_PROFILE_AS_L4   = $f4;
  // ENCODING VOL FLAGS
  XVID_VOL_MPEGQUANT   = $01;  // (1<<0) /* enable MPEG type quantization */
  XVID_VOL_EXTRASTATS  = $02;  // (1<<1) /* enable plane sse stats */
  XVID_VOL_QUARTERPEL  = $04;  // (1<<2) /* enable quarterpel: frames will encoded as quarterpel */
  XVID_VOL_GMC         = $08;  // (1<<3) /* enable GMC; frames will be checked for gmc suitability */
  // ENCODING VOP FLAGS
  XVID_VOP_DEBUG          = $0001; // (1<< 0) /* print debug messages in frames */
  XVID_VOP_HALFPEL          = $0002; // (1<< 1) /* use halfpel interpolation */
  XVID_VOP_INTER4V          = $0004; // (1<< 2) /* use 4 motion vectors per MB */
  XVID_VOP_TRELLISQUANT         = $0008; // (1<< 3) /* use trellis based R-D "optimal" quantization */
  XVID_VOP_CHROMAOPT          = $0010; // (1<< 4) /* enable chroma optimization pre-filter */
  XVID_VOP_CARTOON          = $0020; // (1<< 5) /* use 'cartoon mode' */
  XVID_VOP_GREYSCALE          = $0040; // (1<< 6) /* enable greyscale only mode (even for  color input material chroma is ignored) */
  XVID_VOP_HQACPRED          = $0080; // (1<< 7) /* high quality ac prediction */
  XVID_VOP_MODEDECISION_RD      = $0100; // (1<< 8) /* enable DCT-ME and use it for mode decision */
  XVID_VOP_FAST_MODEDECISION_RD = $1000; // (1<<12) /* use simplified R-D mode decision */
  XVID_VOP_RD_BVOP          = $2000; // (1<<13) /* enable rate-distortion mode decision in b-frames */

  // ENCODING GLOBAL FLAGS
  XVID_GLOBAL_CLOSED_GOP        = $02; //(1<<1) /* closed_gop: was DX50BVOP dx50 bvop compatibility */
  XVID_GLOBAL_EXTRASTATS_ENABLE = $04; //(1<<2)
  XVID_GLOBAL_VOL_AT_IVOP       = $08; //(1<<3) /* write vol at every ivop: WIN32/divx compatibility */
  XVID_GLOBAL_FORCE_VOL         = $10; //(1<<4) /* when vol-based parameters are changed, insert an ivop NOT recommended */

type

  xvid_image_t = packed record
    csp: integer;    // [in] colorspace; or with XVID_CSP_VFLIP to perform vertical flip */
    plane: array[0..3] of pointer;  // [in] image plane ptrs */
    stride: array[0..3] of integer;  // [in] image stride; "bytes per row"*/
  end;

  // ENCODER
  xvid_enc_create_t = packed record
    version: integer;
    profile: integer;          //* [in] profile@level; refer to XVID_PROFILE_xxx */
    width: integer;          //* [in] frame dimensions; width, pixel units */
    height: integer;          //* [in] frame dimensions; height, pixel units */
    num_zones: integer;          //* [in:opt] number of bitrate zones */
    xvid_enc_zone_t: pointer;         //*          ^^ zone array */
    num_plugins: integer;          //* [in:opt] number of plugins */
    xvid_enc_plugin_t: pointer;       //*          ^^ plugin array */
    num_threads: integer;          //* [in:opt] number of threads */
    max_bframes: integer;          //* [in:opt] max sequential bframes (0=disable bframes) */
    global: integer;          //* [in:opt] global flags; controls encoding behavior */
    //* --- vol-based stuff; included here for convenience */
    fincr: integer;          //* [in:opt] framerate increment; set to zero for variable framerate */
    fbase: integer;          //* [in] framerate base frame_duration = fincr/fbase seconds*/
    //* ---------- */
    //* --- vop-based; included here for convenience */
    max_key_interval: integer;        //* [in:opt] the maximum interval between key frames */
    frame_drop_ratio: integer;        //* [in:opt] frame dropping: 0=drop none... 100=drop all */
    bquant_ratio: integer;          //* [in:opt] bframe quantizer multipier/offeset; used to decide bframes quant when bquant==-1 */
    bquant_offset: integer;          //* bquant = (avg(past_ref_quant,future_ref_quant)*bquant_ratio + bquant_offset) / 100 */
    min_quant: array[0..2] of integer;//* [in:opt] */
    max_quant: array[0..2] of integer;//* [in:opt] */
    //* ---------- */
    handle: pointer;          //* [out] encoder instance handle */
  end;

  xvid_enc_frame_t = packed record
    version: integer;
    //* VOL related stuff
    //* unless XVID_FORCEVOL is set, the encoder will not react to any changes
    //* here until the next VOL (keyframe).
    vol_flags: integer;          //* [in] vol flags */
    quant_intra_matrix: pointer;          //* [in:opt] custom intra qmatrix */
    quant_inter_matrix: pointer;          //* [in:opt] custom inter qmatrix */
    par: integer;          //* [in:opt] pixel aspect ratio (refer to XVID_PAR_xxx above) */
    par_width: integer;          //* [in:opt] aspect ratio width */
    par_height: integer;          //* [in:opt] aspect ratio height */
    //* Other fields that can change on a frame base */
    fincr: integer;          //* [in:opt] framerate increment, for variable framerate only */
    vop_flags: integer;          //* [in] (general)vop-based flags */
    motion: integer;          //* [in] ME options */
    input: xvid_image_t;          //* [in] input image (read from) */
    coding_type: integer;          //* [in:opt] coding type */
    quant: integer;          //* [in] frame quantizer; if <=0, automatic (ratecontrol) */
    bframe_threshold: integer;
    bitstream: pointer;          //* [in:opt] bitstream ptr (written to)*/
    length: integer;          //* [in:opt] bitstream length (bytes) */
    out_flags: integer;          //* [out] bitstream output flags */
  end;

  xvid_enc_stats_t = packed record
    version: integer;
    //* encoding parameters
    coding_type: integer;      //* [out] coding type */
    quant: integer;          //* [out] frame quantizer */
    vol_flags: integer;        //* [out] vol flags (see above) */
    vop_flags: integer;        //* [out] vop flags (see above) */
    //* bitrate */
    length: integer;          //* [out] frame length */
    hlength: integer;          //* [out] header length (bytes) */
    kblks: integer;          //* [out] number of blocks compressed as Intra */
    mblks: integer;          //* [out] number of blocks compressed as Inter */
    ublks: integer;          //* [out] number of blocks marked as not_coded */
    sse_y: integer;          //* [out] Y plane's sse */
    sse_u: integer;          //* [out] U plane's sse */
    sse_v: integer;          //* [out] V plane's sse */
  end;

  // DECODER

  xvid_gbl_init_t = packed record
    version: integer;
    cpu_flags: dword;   // [in:opt] zero = autodetect cpu; XVID_CPU_FORCE|{cpu features} = force cpu features */
    debug: integer;     // [in:opt] debug level */
  end;

  xvid_dec_create_t = packed record
    version: integer;
    width: integer;     // [in:opt] image width */
    height: integer;    // [in:opt] image width */
    handle: pointer;    // [out]    decore context handle */
  end;

  xvid_dec_frame_t = packed record
    version: integer;
    general: integer;         // [in:opt] general flags */
    bitstream: pointer;       // [in]     bitstream (read from)*/
    length: integer;          // [in]     bitstream length */
    output: xvid_image_t;     // [in]     output image (written to) */
    brightness: integer;      // [in]   brightness offset (0=none) */
  end;

  vop_t = packed record
    general: integer;         // [out] flags */
    time_base: integer;       // [out] time base */
    time_increment: integer;  // [out] time increment */
    // XXX: external deblocking stuff */
    qscale: ^integer;       // [out] pointer to quantizer table */
    qscale_stride: integer;   // [out] quantizer scale stride */
  end;
  vol_t = packed record
    general: integer;         // [out] flags */
    width: integer;          // [out] width */
    height: integer;          // [out] height */
    par: integer;          // [out] pixel aspect ratio (refer to XVID_PAR_xxx above) */
    par_width: integer;       // [out] aspect ratio width  [1..255] */
    par_height: integer;      // [out] aspect ratio height [1..255] */
  end;
  xvid_dec_stats_t = packed record
    version: integer;
    frametype: integer;       // [out] output data type */
    vop: vop_t;
    vol: vol_t;
  end;

function xvid_global(hnd: pointer; opt: integer; param1: pointer; param2: pointer): integer; cdecl; external XVID_DLL;
function xvid_decore(hnd: pointer; opt: integer; param1: pointer; param2: pointer): integer; cdecl; external XVID_DLL;
function xvid_encore(hnd: pointer; opt: integer; param1: pointer; param2: pointer): integer; cdecl; external XVID_DLL;

implementation

end.
register 32407 2007/12/26 0:18:33
虽然暂时没用上,但很感谢LZ!
第一页 上一页 下一页 最后页 有 39 条纪录 共2页 21 - 39
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表