/*****************************************************************************/
/* tpkMpegInfo.h  */
/*  */
/* Includes FileInfo structures definition and functions declaration  */
/*  */
/*****************************************************************************/#ifndef _TPK_MPEGINFO_H_
#define _TPK_MPEGINFO_H_
#if defined(__cplusplus)
extern "C"
{         
#endif#include <windows.h>#ifndef TPKRTDAPI
#define TPKRTDAPI __stdcall
#endif#ifdef _WIN32 
#define   far
#endif /***********************Error List********************************/
#define NO_SUCH_FILE 0x1
#define MEMORY_ALLOC_ERR 0x2
#define FILE_NOT_SUPPORT 0x3
/*********************End Error List******************************/typedef enum {
VP_VF_MPEG_I=1,
VP_VF_MPEG_II
}VIDEO_TYPE;typedef enum {
VP_ST_VIDEO=0,//mpeg video 
VP_ST_AUDIO,//mpeg audio or uncompressed wav
VP_ST_PES,//mpeg pes
VP_ST_SYSTEM,//mpeg1
VP_ST_PROGRAM,//mpeg2 program stream
VP_ST_TRANSPORT_188,//mpeg2 transport stream,包长188
VP_ST_TRANSPORT_204 //mpeg2 transport stream,包长204
}SYSTEM_TYPE;/* structures definition *//*-- AUDIO_INFO struct ----*/
typedef struct 
{
unsigned char ucStereo:4;          /* 0= mono    1= stereo                    */
unsigned char ucLayer:4;           /* 0= AC-3    1= Layer-I  2= Layer-II
3= Layer-III 4 = wav 15:NOT SUPPORTRF*/
unsigned char ucBitRateIndex:4 ;
unsigned char ucFreqIndex:4;       /* 0 - 44100, 1 - 48000, 2 - 32000 Hz      */
unsigned short unBitRate;         /* Bit Rate (in K bits per second).          */
unsigned char ucMode;
unsigned char ucModeExt;
unsigned short unSampFreq;
char szAudioMode[16];  
} AUDIO_INFO , far *LP_AUDIO_INFO;/*-- TIME_CODE struct : from GOP */
typedef struct
{
unsigned char  isDrop:1; /* drop frame flag */
unsigned char  ucPic:7;
unsigned char  ucSec;
unsigned char  ucMin;
unsigned char  ucHours;
} TIME_CODE, far *LP_TIME_CODE ;  /* Sequence header info */ 
typedef struct
{
int dwOffSet;    /* OffSet of Video Packet (Sequence Header for ES) from begining of file  */
unsigned short  unHorizSize;
unsigned short  unVertSize;
unsigned char   ucPelAspectRatio;
unsigned char   ucChromaFormat;
unsigned char ucVideoFormat;
unsigned char ucFrameRate;
float fPicturePerSecond;
unsigned int dwBitRate;
}SEQ_INFO,  far* LP_SEQ_INFO;/*--MAIN_VIDEO_INFO--*/
typedef struct tagMAIN_VIDEO_INFO
{
unsigned short unVPID;
unsigned char ucStreamID;
unsigned char fGetInfo:3; 
unsigned char fSecondField:1;
unsigned char fGetPTS:3; 
unsigned char   fTimecode:1;//时码是否正常
VIDEO_TYPE VideoType;
SEQ_INFO SeqInfo;
__int64 qwFirstVPTS;
__int64 qwLastVPTS;
TIME_CODE FirstTimeCode;
TIME_CODE LastTimeCode;
unsigned char ucReserved[8];
struct tagMAIN_VIDEO_INFO *pNext;
}MAIN_VIDEO_INFO, far *LP_MAIN_VIDEO_INFO;/*--MAIN_AUDIO_INFO--*/
typedef struct tagMAIN_AUDIO_INFO
{
unsigned short unAPID;
unsigned char ucStreamID;
unsigned char fGetInfo:4; 
unsigned char fGetPTS:4; 
AUDIO_INFO AudioInfo;
__int64 qwFirstAPTS;
__int64 qwLastAPTS;
unsigned char ucReserved[8];
char szLanguage[20];
struct tagMAIN_AUDIO_INFO * pNext;
}MAIN_AUDIO_INFO, far *LP_MAIN_AUDIO_INFO;/*--SCR_INFO--*/
typedef struct
{
__int64        qwFirstSCRB;
__int64        qwLastSCRB;
}SCR_INFO, far *LP_SCR_INFO;/*-- SUBTITLE(DVD字幕) INFO struct --*/
typedef struct tagMAIN_SUBT_INFO
{
unsigned short unSubID;
char szLanguage[20];
struct tagMAIN_SUBT_INFO *pNext;
}MAIN_SUBT_INFO, far *LP_MAIN_SUBT_INFO;/*-- PROGRAM_TABLE struct --*/
typedef struct tagPROGRAM_TABLE
{
unsigned short unProgramNo;
unsigned short ucNumVideoStream:4;
unsigned short ucNumAudioStream:6;
unsigned short ucNumSubTitle:6;
unsigned int unMAPPID:13;
unsigned int unPCRPID:13;
unsigned int ucVerNum:6;
LP_SCR_INFO lpSCRInfo;
LP_MAIN_AUDIO_INFO lpMainAudio;
LP_MAIN_VIDEO_INFO lpMainVideo;
LP_MAIN_SUBT_INFO  lpSubInfo;
unsigned char *pSubClut;
struct tagPROGRAM_TABLE *pNext;
}PROGRAM_TABLE,far *LP_PROGRAM_TABLE;
/*--STREAM_INFO--*/
typedef struct 
{
int  iOffset;
SYSTEM_TYPE  StreamType;
unsigned short   unVersion;
unsigned short  unNumberofProgram;
PROGRAM_TABLE    *lpProgramTable;
unsigned int     dwMuxRate;
}STREAM_INFO,far *LP_STREAM_INFO;/* FileInfo function */
short TPKRTDAPI tpkFileInfo(LPCCH strFileName,LP_STREAM_INFO *lpInfo);
LP_STREAM_INFO TPKRTDAPI tpkFileInfoA(LPCCH strFileName);short TPKRTDAPI tpkFreeInfo(LP_STREAM_INFO lpInfo);unsigned int TPKRTDAPI tpkGetDuration(LPCCH strFileName);
float TPKRTDAPI tpkGetFrameRate(LPCCH strFileName);#if defined(__cplusplus)
}
#endif 
#endif
*******上面是完整的H文件,里面有位段操作,如:
/*-- TIME_CODE struct : from GOP */
typedef struct
{
unsigned char  isDrop:1; /* drop frame flag */
unsigned char  ucPic:7;
unsigned char  ucSec;
unsigned char  ucMin;
unsigned char  ucHours;
} TIME_CODE, far *LP_TIME_CODE ;  中的 unsigned char  isDrop:1; /* drop frame flag */
unsigned char  ucPic:7;
做过的朋友希望能帮忙翻译下,十分感谢,能全部翻译更好,可加分,因为我翻译的其他语句自己不知道是否正确!!! 真有点想现金求教了啊!!!

解决方案 »

  1.   

    有武汉的朋友可联系多交流下,很想结交delphi朋友,其他地方的也可以加我QQ:270274971,欢迎来武汉玩
      

  2.   

    //CALLBACK FUNCTION DEFINITION
    typedef short (*tpkCALLBACK)(short, LPVOID, LPDWORD);把这个也帮忙翻译下
      

  3.   

    Delphi没有C当中的位变量,所以必须至少以字节为单位读写.一个字节可以有8个位,有2种操作方法:1,直接使用逻辑和移位操作;2,使用集合sets.举一个使用集合的例子:  
      type  
      TMyBit=0..7;  
      TMyBits=set   of   TMyBit;  
      ...  
      var  
      Mybits:TMyBits;  
      f:File;  
      i:Integer;  
      ...  
          MyBits:=[];                 //b00000000  
          i:=0;  
          MyBits:=MyBits+[i];   //b00000001  
          MyBits:=MyBits+[1];     //b00000011  
          MyBits:=MyBits+[7];     //b10000011  
          MyBits:=MyBits-[7];     //b00000011  
          MyBits:=[0..7];             //b11111111  
          AssignFile(f,'c:\test.data');  
          Rewrite(f,1);  
          BlockWrite(f,MyBits,1);  
          CloseFile(f);
      

  4.   

    typedef short (*tpkCALLBACK)(short, LPVOID, LPDWORD);
    一个函数指针的类型
      

  5.   

    hongqi162(失踪的月亮)
    akirya(坏[其实偶不是什么所谓的坏人]) 
    ------------
    谢谢,我看的不大懂,能否帮忙翻译下,又要出差了,郁闷,带着问题上路,,,小公司,做技术还要做市场,请继续支持,万分感谢!!!!!!!!!!
      

  6.   

    typedef short (*tpkCALLBACK)(short, LPVOID, LPDWORD);short func(short, LPVOID, LPDWORD)
    {
    ....具体实现
    }
    tpkCALLBACK xxx = func;
    tpkCALLBACK( ... );这个时候就等价与func( ... );
      

  7.   

    有没有高手帮忙啊,把位段那部分给转换成DELPHI,万分感谢!!!!!!!!!
      

  8.   

    constantine(飘遥的安吉儿) ( ) 
    ------------------
    大哥,我还真不会,概念都忘了,以前的忘完了,说下什么书有介绍,去图书馆做一天,,我现在手上没有这方面的书,,,大学都时在星级中过来的,基础没打好啊,看着你们的方法来自责,         哎,悔时已晚,已经折腾了两个礼拜了
      

  9.   

    Delphi中确实没有和C位域字段匹配的类型,只能用代码实现对位的操作,所以用record不太好模拟,只能按字节定义,或定义为byte,或定义为set,但是无论如何,对其操作都必须用代码。比如结构
    typedef struct
    {
    unsigned char  isDrop:1; /* drop frame flag */
    unsigned char  ucPic:7;
    unsigned char  ucSec;
    unsigned char  ucMin;
    unsigned char  ucHours;
    } TIME_CODE, far *LP_TIME_CODE ; 
    在C中可以写xx.isProp = 1;xx.ucPic = 48等,而在Delphi中只能这样定义:
    PTime_Code = ^TTime_Code;
    LPTime_Code = PTime_Code;
    TTime_Code = packed record
      isDrop_ucPic: Byte;   // 2个位段刚好8字节
      ucSec: Byte;
      ....
    end;
    操作时如上面的C代码可以写成:xx.isDrop_ucPic := 1;xx.isDrop_ucPic := 48 shl 1;
    set替代最好适用位段全为1的字段,否则也很麻烦。至于
    typedef short (*tpkCALLBACK)(short, LPVOID, LPDWORD);
    可以写成:type
      tpkCALLBACK = function(p1: SmallInt; p2: Pointer; p3: PLongWord): SmallInt;
      

  10.   

    更正:typedef short (*tpkCALLBACK)(short, LPVOID, LPDWORD);
    应该是个回调函数,可以写成:type
      tpkCALLBACK = function(p1: SmallInt; p2: Pointer; p3: PLongWord): SmallInt; stdcall;
      

  11.   

    typedef struct
    {
    unsigned char  isDrop:1; /* drop frame flag */
    unsigned char  ucPic:7;
    unsigned char  ucSec;
    unsigned char  ucMin;
    unsigned char  ucHours;
    } TIME_CODE, far *LP_TIME_CODE ;
    在C中可以写xx.isProp = 1;xx.ucPic = 48等,而在Delphi中只能这样定义:
    PTime_Code = ^TTime_Code;
    LPTime_Code = PTime_Code;
    TTime_Code = packed record
      isDrop_ucPic: Byte;   // 2个位段刚好8字节
      ucSec: Byte;
      ....
    end;
    操作时如上面的C代码可以写成:xx.isDrop_ucPic := 1;xx.isDrop_ucPic := 48 shl 1;
    ----------------------------
    xx.isDrop_ucPic := 1;xx.isDrop_ucPic := 48 shl 1;
    这里xx.isDrop_ucPic := 1;中的1是表示 unsigned char  isDrop:1; 中的1 吗?
    xx.isDrop_ucPic := 48 shl 1;------这语句怎么介绍啊?为什么要用48 shl 1呢?
    我对这方面的基础不熟悉,多说下啊,QQ有朋友给我发了一个翻译,但我看不懂每个语句的意思,所以不能对其他语句进行操作,,,谢谢对解释下语句的意思!!!
      

  12.   

    原C结构中
    typedef struct
    {
    unsigned char  isDrop:1; /* 这里的1不是初值,而是定义这个变量为二进制的1个位 */
    unsigned char  ucPic:7;  /* 同样,定义这个变量为二进制的7个位 */
    unsigned char  ucSec;
    unsigned char  ucMin;
    unsigned char  ucHours;
    } TIME_CODE, far *LP_TIME_CODE ;C代码举例:xx.isProp = 1;因为isProp只有一个位,其值只能是1或0
    xx.ucPic = 48;upPic有7个位,最大值为127,例子赋值48在Delphi中
    TTime_Code = packed record
      isDrop_ucPic: Byte;   // 2个位段刚好8字节,所以合并为一个字节
      ucSec: Byte;
      ....
    end;将上面C例子翻译过来,原isDrop在isDrop_ucPic中占据第一个位,即0位,所以可直接写xx.isDrop_ucPic := 1;(反复强调,原来的unsigned char  isDrop:1;不是给的初值,而是C位域字段的定义形式)
    而原upPic占据isDrop_ucPic的1-7位,要将原来ucPic赋值48,必须左移1个位,即让过isDrop占据的0位,所以表达式变为了xx.isDrop_ucPic := 48 shl 1;这样才和上面C例子中的赋值过程相符。不知道我上面解释明白没有,如果你听不明白,证明你对二进制和C的位域概念不清楚,请先搞清楚这些概念就明白了,否则,再怎么解释你也不会明白!
      

  13.   

    maozefa(阿发伯) ( ) 
    ----------
    你也在啊,我现在明白些了,非常谢你的回复!!!我再好好看下,看来我还是概念太陌生了,我已经怕解决这个问题了。再次谢谢你的热情指教!
      

  14.   

    现在没事,再给你用图示解释一下:x x x x x x x x0 1 2 3 4 5 6 7计算机基本计量单位是字节,上面是一个字节的二进制形式, 下面0-7表示的是位号,共8个位,每个位x只能表示0或1。
    原结构中unsigned char  isDrop:1;表示占据一个位,因这个变量在最前面,所以占据了0位;unsigned char  ucPic:7;占7个位只能占据1 - 7位的位置了,和起来就是delphi记录的isDrop_ucPic,见下图。
      
    isDrop_ucPic:  x    xxxxxxx   
                 isDrop  ucPic如果给isDrop=1相当于isDrop_ucPic=1,但是如果ucPic=1,相对IsDrop_ucPic来说,其实是2,加起来为3,所以Delphi中写为isDrop_ucPic := 1 shl 1,前面unPic = 48也是一个道理,相当于isDrop_ucPic = 96,写成Delphi的isDrop_ucPic := 48 shl 1,图示如下:isDrop_ucPic=99:  1       0000110    
                    isDrop=1   ucPic=48
      

  15.   

    说明, 按我上面的二进制方向(是反向的)。理解shl,shr时刚好相反,请注意,
      

  16.   

    对不起,我上面写反向了,可能增加你理解的难度,下面更正过来:x x x x x x x x7 6 5 4 3 2 1 9计算机基本计量单位是字节,上面是一个字节的二进制形式, 下面0-7表示的是位号,共8个位,每个位x只能表示0或1。
    原结构中unsigned char  isDrop:1;表示占据一个位,因这个变量在最前面,所以占据了0位;unsigned char  ucPic:7;占7个位只能占据1 - 7位的位置了,和起来就是delphi记录的isDrop_ucPic,见下图。
      
    isDrop_ucPic:  xxxxxxx   x 
                    ucPic  isDrop如果给isDrop=1相当于isDrop_ucPic=1,但是如果ucPic=1,相对IsDrop_ucPic来说,其实是2,加起来为3,所以Delphi中写为isDrop_ucPic := 1 shl 1,前面unPic = 48也是一个道理,相当于isDrop_ucPic = 96,写成Delphi的isDrop_ucPic := 48 shl 1,图示如下:isDrop_ucPic=97: 0110000      1
                     ucPic=48  isDrop=1 
      

  17.   

    光出错:x x x x x x x x7 6 5 4 3 2 1 0
      

  18.   

    heihei,今天给我的等待是最有价值的,也是最吸引我的,看到的都是想了解的,朋友你也很热情,感觉真是无限好啊!!!!!!!!!!谢谢maozefa(阿发伯) 兄弟,来武汉我请你鸭脖子和热干面(不好意思:热干面1.7元一碗,只是早上吃),然后来个黄鹤楼套件~~