/*******************************************************}

{                                                       }

{       File : TS_program_map_section_class.h           }

{       Created by Tsviatko Jongov                      }

{       http://tsviatko.jongov.com                      }

{                                                       }

{       PMT transport packet class.                     }

{                                                       }

{*******************************************************/

   

#ifndef __TS_PROGRAM_MAP_SECTION_CLASS_H__

#define __TS_PROGRAM_MAP_SECTION_CLASS_H__

   

#include "MPEGTSUtils.h"

#include "psi_transport_packet_class.h"

   

class CTS_program_map_section_class : public Cpsi_transport_packet_class

{

public:

    TS_program_map_section m_TS_program_map_section;

public:

    bool SetData(void * Data, unsigned long Size)

    {

        bool res;

        unsigned char * p;

        unsigned char * ps;

        res = Cpsi_transport_packet_class::SetData(Data, Size);

        if (!res)

        {

            OutputDebugString(L"tsv: Error in CTS_program_map_section_class.SetData call...");

            return res;

        }

       

        p = &m_Data[m_PayloadOffset + 1 + m_pointer_field];

       

        m_TS_program_map_section.table_id = *p;

        p++;

       

        m_TS_program_map_section.section_syntax_indicator = (*p >> 7) & 0x01;

        m_TS_program_map_section.zero_bit = (*p >> 6) & 0x01;

        m_TS_program_map_section.reserved0 = (*p >> 4) & 0x03;

        m_TS_program_map_section.section_length = (*p & 0x0F) << 8;

        p++;

       

        m_TS_program_map_section.section_length = m_TS_program_map_section.section_length | *p;

        p++;

       

        ps = p; //index for section length.

       

        m_TS_program_map_section.program_number = *p << 8;

        p++;

       

        m_TS_program_map_section.program_number = m_TS_program_map_section.program_number | *p;

        p++;

       

        m_TS_program_map_section.reserved1 = (*p >> 6) & 0x03;

        m_TS_program_map_section.version_number = (*p >> 1) & 0x1F;

        m_TS_program_map_section.current_next_indicator = *p & 0x01;

        p++;

       

        m_TS_program_map_section.section_number = *p;

        p++;

       

        m_TS_program_map_section.last_section_number = *p;

        p++;

       

        m_TS_program_map_section.reserved2 = (*p >> 5) & 0x07;

       

        m_TS_program_map_section.PCR_PID = (*p & 0x1F) << 8;

        p++;

       

        m_TS_program_map_section.PCR_PID = m_TS_program_map_section.PCR_PID | *p;

        p++;

       

        m_TS_program_map_section.reserved3 = (*p >> 4) & 0x0F;

       

        m_TS_program_map_section.program_info_length = (*p & 0x0F) << 8;

        p++;

       

        m_TS_program_map_section.program_info_length = m_TS_program_map_section.program_info_length | *p;

        p++;

       

        //descriptor() - TO BE IMPLEMENTED

        p += m_TS_program_map_section.program_info_length;

       

        m_TS_program_map_section.streams_count = 0;

        while (4 + (unsigned long)(p - ps) < m_TS_program_map_section.section_length)

        {

            m_TS_program_map_section.stream_type[m_TS_program_map_section.streams_count] = *p;

            p++;

           

            m_TS_program_map_section.reserved4[m_TS_program_map_section.streams_count] = (*p >> 5) & 0x07;

           

            m_TS_program_map_section.elementary_PID[m_TS_program_map_section.streams_count] = (*p & 0x1F) << 8;

            p++;

           

            m_TS_program_map_section.elementary_PID[m_TS_program_map_section.streams_count] =

                m_TS_program_map_section.elementary_PID[m_TS_program_map_section.streams_count] | *p;

            p++;

           

            m_TS_program_map_section.reserved5[m_TS_program_map_section.streams_count] = (*p >> 4) & 0x0F;

           

            m_TS_program_map_section.ES_info_length[m_TS_program_map_section.streams_count] = (*p & 0x0F) << 8;

            p++;

           

            m_TS_program_map_section.ES_info_length[m_TS_program_map_section.streams_count] =

                m_TS_program_map_section.ES_info_length[m_TS_program_map_section.streams_count] | *p;

            p++;

           

            //descriptor() - TO BE IMPLEMEBTED

            p += m_TS_program_map_section.ES_info_length[m_TS_program_map_section.streams_count];

           

            m_TS_program_map_section.streams_count++;

        }

       

        m_TS_program_map_section.CRC_32 = *p << 24;

        p++;

       

        m_TS_program_map_section.CRC_32 = m_TS_program_map_section.CRC_32 | (*p << 16);

        p++;

       

        m_TS_program_map_section.CRC_32 = m_TS_program_map_section.CRC_32 | (*p << 8);

        p++;

       

        m_TS_program_map_section.CRC_32 = m_TS_program_map_section.CRC_32 | *p;

       

        return true;

    }

};

   

#endif // __TS_PROGRAM_MAP_SECTION_CLASS_H__