MPEG TS Header, проблемы со структурой

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 9 Sep 2011.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    PHP:
    struct mpeghdr_t
    {
        
    unsigned char syncbyte:8;
        
    unsigned char transperror:1;
        
    unsigned char payloadUS:1;
        
    unsigned char transportpriority:1;
        
    unsigned short pid:13;
        
    unsigned char scramblingcontrol:2;
        
    unsigned char adaptationfieldexist:2;
        
    unsigned char continuitycounter:4;
    };
    Подскажите, что не так в данной структуре, вроде бы все смещения правильные, однако

    PHP:
    mpeghdr_t *pMpeg = (mpeghdr_t *)buff;

    LogPrintf"PID: %d\n"pMpeg->pid );
    выдает чушь, а

    PHP:
    unsigned short pid = (buff[1] << buff[2]) & 0x1fff;

    LogPrintf"PID: %d\n"pid );
    выдает правильный результат.
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    наверное из-за автовыравнения структур.

    попробуй записать так:
    Code:
    
    #pragma pack(push, 1)
    
    typedef struct _mpeghdr_t
    {
        unsigned char syncbyte:8;
        unsigned char transperror:1;
        unsigned char payloadUS:1;
        unsigned char transportpriority:1;
        unsigned short pid:13;
        unsigned char scramblingcontrol:2;
        unsigned char adaptationfieldexist:2;
        unsigned char continuitycounter:4;
    } mpeghdr_t;  
    
    #pragma pack(pop)
    
     
  3. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Нет, это тоже не сработало :(
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Так 100% должно работать.
    У тебя ошибка была еще в том, что биты не правильно сцеплялись в байты.

    Такая структура - 4 байта.
    То что я перед этим показал - 5 байта была из-за неправильного сцепления бит в байты
    а то что ты показал - там было 6 байт из-за округления.
    Code:
    #pragma pack(push, 1)
    
    typedef struct _mpeghdr_t
    {
        unsigned char syncbyte;
        unsigned short transperror:1;
        unsigned short payloadUS:1;
        unsigned short  transportpriority:1;
        unsigned short pid:13;
        unsigned char scramblingcontrol:2;
        unsigned char adaptationfieldexist:2;
        unsigned char continuitycounter:4;
    } mpeghdr_t;  
    
    #pragma pack(pop)
    
     
    #4 slesh, 9 Sep 2011
    Last edited: 9 Sep 2011
    1 person likes this.
  5. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Хм, опять же не работает, у меня TS с PID 1000, а структура выводит: 7424 и 7432

    PHP:
    #pragma pack(push, 1)

    typedef struct _mpeghdr_t
    {
        
    unsigned char syncbyte;
        
    unsigned short transperror:1;
        
    unsigned short payloadUS:1;
        
    unsigned short  transportpriority:1;
        
    unsigned short pid:13;
        
    unsigned char scramblingcontrol:2;
        
    unsigned char adaptationfieldexist:2;
        
    unsigned char continuitycounter:4;
    mpeghdr_t;  

    #pragma pack(pop)

    void __stdcall StreamGetterunsigned char *buffint len )
    {
        if( 
    len != 188 )
        {
            
    LogPrintf"Warning: Size TP pack: %d != 188\n"len );
            return;
        }

        
    mpeghdr_t *pMpeg = (mpeghdr_t *)buff;

        
    LogPrintf"PID: %d\n"pMpeg->pid );

        
    unsigned short pid = (buff[1] << buff[2]) & 0x1fff;

        
    LogPrintf"Rel PID: %d\n"pid );
    }
    Может, я ошибся в составлении структуры?

    Документация по TS
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    вообще откуда такие вычисления?

    unsigned short pid = (buff[1] << 8 | buff[2]) & 0x1fff;

    структура правильная это 100% покажи первые 4 байта буфера.
     
  7. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Ок

    Code:
    PID: 7432
    Rel PID: 1000
    Hex Pack: 47 43 E8 15
    PID: 7424
    Rel PID: 1000
    Hex Pack: 47 03 E8 16
    PID: 7432
    Rel PID: 1000
    Hex Pack: 47 43 E8 17
    PID: 7432
    Rel PID: 1000
    Hex Pack: 47 43 E8 18
    PID: 7424
    Rel PID: 1000
    Hex Pack: 47 03 E8 19
    PID: 7424
    Rel PID: 1000
    Hex Pack: 47 03 E8 1A
    
    
    
    PID: 3208
    Rel PID: 100
    Hex Pack: 47 40 64 16
    PID: 7432
    
    PID: 520
    Rel PID: 16
    Hex Pack: 47 40 10 16
    
     
    #7 fire64, 9 Sep 2011
    Last edited: 9 Sep 2011
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вот же блин, жестоко выходит тут всё с этими битами за счет того что они повёрнуты
    Code:
    #pragma pack(push, 1) 
    typedef struct _mpeghdr_t
    {
    	DWORD syncbyte:8;
    	
    	DWORD pid_h:5;
    
    	DWORD transperror:1;
    	DWORD payloadUS:1;
    	DWORD transportpriority:1;
    
    	DWORD pid_l:8;
    	
    	DWORD scramblingcontrol:2;
    	DWORD adaptationfieldexist:2;
    	DWORD continuitycounter:4;
        
    } mpeghdr_t;  
    #pragma pack(pop) 
    
    PID = (pid_h << 8) + pid_l;
    
    
     
    1 person likes this.
  9. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Спасибо :)