/*******************************************************}
{
}
{ 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__