winlin

add ts packet definition for #250.

@@ -400,6 +400,16 @@ SrsMpegtsFrame::SrsMpegtsFrame() @@ -400,6 +400,16 @@ SrsMpegtsFrame::SrsMpegtsFrame()
400 key = false; 400 key = false;
401 } 401 }
402 402
  403 +SrsTsPacket::SrsTsPacket()
  404 +{
  405 + adaptation_field = NULL;
  406 +}
  407 +
  408 +SrsTsPacket::~SrsTsPacket()
  409 +{
  410 + srs_freep(adaptation_field);
  411 +}
  412 +
403 SrsTSMuxer::SrsTSMuxer(SrsFileWriter* w) 413 SrsTSMuxer::SrsTSMuxer(SrsFileWriter* w)
404 { 414 {
405 writer = w; 415 writer = w;
@@ -59,6 +59,154 @@ public: @@ -59,6 +59,154 @@ public:
59 }; 59 };
60 60
61 /** 61 /**
  62 +* the pid of ts packet,
  63 +* Table 2-3 ¨C PID table, hls-mpeg-ts-iso13818-1.pdf, page 37
  64 +*/
  65 +enum SrsTsPid
  66 +{
  67 + // Program Association Table(see Table 2-25).
  68 + SrsTsPidPAT = 0x00,
  69 + // Conditional Access Table (see Table 2-27).
  70 + SrsTsPidCAT = 0x01,
  71 + // Transport Stream Description Table
  72 + SrsTsPidTSDT = 0x02,
  73 + // null packets (see Table 2-3)
  74 + SrsTsPidNULL = 0x01FFF,
  75 +};
  76 +
  77 +/**
  78 +* the transport_scrambling_control of ts packet,
  79 +* Table 2-4 ¨C Scrambling control values, hls-mpeg-ts-iso13818-1.pdf, page 38
  80 +*/
  81 +enum SrsTsScrambled
  82 +{
  83 + // Not scrambled
  84 + SrsTsScrambledDisabled = 0x00,
  85 + // User-defined
  86 + SrsTsScrambledUserDefined1 = 0x01,
  87 + // User-defined
  88 + SrsTsScrambledUserDefined2 = 0x02,
  89 + // User-defined
  90 + SrsTsScrambledUserDefined3 = 0x03,
  91 +};
  92 +
  93 +/**
  94 +* the adaption_field_control of ts packet,
  95 +* Table 2-5 ¨C Adaptation field control values, hls-mpeg-ts-iso13818-1.pdf, page 38
  96 +*/
  97 +enum SrsTsAdaptationFieldType
  98 +{
  99 + // Reserved for future use by ISO/IEC
  100 + SrsTsAdaptationFieldTypeReserved = 0x00,
  101 + // No adaptation_field, payload only
  102 + SrsTsAdaptationFieldTypePayloadOnly = 0x01,
  103 + // Adaptation_field only, no payload
  104 + SrsTsAdaptationFieldTypeAdaptionOnly = 0x02,
  105 + // Adaptation_field followed by payload
  106 + SrsTsAdaptationFieldTypeBoth = 0x03,
  107 +};
  108 +
  109 +class SrsTsAdaptationField
  110 +{
  111 +};
  112 +
  113 +/**
  114 +* the packet in ts stream,
  115 +* 2.4.3.2 Transport Stream packet layer, hls-mpeg-ts-iso13818-1.pdf, page 36
  116 +* Transport Stream packets shall be 188 bytes long.
  117 +*/
  118 +class SrsTsPacket
  119 +{
  120 +private:
  121 + /**
  122 + * The sync_byte is a fixed 8-bit field whose value is '0100 0111' (0x47). Sync_byte emulation in the choice of
  123 + * values for other regularly occurring fields, such as PID, should be avoided.
  124 + */
  125 + int8_t sync_byte; //8bits
  126 + /**
  127 + * The transport_error_indicator is a 1-bit flag. When set to '1' it indicates that at least
  128 + * 1 uncorrectable bit error exists in the associated Transport Stream packet. This bit may be set to '1' by entities external to
  129 + * the transport layer. When set to '1' this bit shall not be reset to '0' unless the bit value(s) in error have been corrected.
  130 + */
  131 + int8_t transport_error_indicator; //1bit
  132 + /**
  133 + * The payload_unit_start_indicator is a 1-bit flag which has normative meaning for
  134 + * Transport Stream packets that carry PES packets (refer to 2.4.3.6) or PSI data (refer to 2.4.4).
  135 + *
  136 + * When the payload of the Transport Stream packet contains PES packet data, the payload_unit_start_indicator has the
  137 + * following significance: a '1' indicates that the payload of this Transport Stream packet will commence with the first byte
  138 + * of a PES packet and a '0' indicates no PES packet shall start in this Transport Stream packet. If the
  139 + * payload_unit_start_indicator is set to '1', then one and only one PES packet starts in this Transport Stream packet. This
  140 + * also applies to private streams of stream_type 6 (refer to Table 2-29).
  141 + *
  142 + * When the payload of the Transport Stream packet contains PSI data, the payload_unit_start_indicator has the following
  143 + * significance: if the Transport Stream packet carries the first byte of a PSI section, the payload_unit_start_indicator value
  144 + * shall be '1', indicating that the first byte of the payload of this Transport Stream packet carries the pointer_field. If the
  145 + * Transport Stream packet does not carry the first byte of a PSI section, the payload_unit_start_indicator value shall be '0',
  146 + * indicating that there is no pointer_field in the payload. Refer to 2.4.4.1 and 2.4.4.2. This also applies to private streams of
  147 + * stream_type 5 (refer to Table 2-29).
  148 + *
  149 + * For null packets the payload_unit_start_indicator shall be set to '0'.
  150 + *
  151 + * The meaning of this bit for Transport Stream packets carrying only private data is not defined in this Specification.
  152 + */
  153 + int8_t payload_unit_start_indicator; //1bit
  154 + /**
  155 + * The transport_priority is a 1-bit indicator. When set to '1' it indicates that the associated packet is
  156 + * of greater priority than other packets having the same PID which do not have the bit set to '1'. The transport mechanism
  157 + * can use this to prioritize its data within an elementary stream. Depending on the application the transport_priority field
  158 + * may be coded regardless of the PID or within one PID only. This field may be changed by channel specific encoders or
  159 + * decoders.
  160 + */
  161 + int8_t transport_priority; //1bit
  162 + /**
  163 + * The PID is a 13-bit field, indicating the type of the data stored in the packet payload. PID value 0x0000 is
  164 + * reserved for the Program Association Table (see Table 2-25). PID value 0x0001 is reserved for the Conditional Access
  165 + * Table (see Table 2-27). PID values 0x0002 ¨C 0x000F are reserved. PID value 0x1FFF is reserved for null packets (see
  166 + * Table 2-3).
  167 + */
  168 + SrsTsPid pid; //13bits
  169 + /**
  170 + * This 2-bit field indicates the scrambling mode of the Transport Stream packet payload.
  171 + * The Transport Stream packet header, and the adaptation field when present, shall not be scrambled. In the case of a null
  172 + * packet the value of the transport_scrambling_control field shall be set to '00' (see Table 2-4).
  173 + */
  174 + SrsTsScrambled transport_scrambling_control; //2bits
  175 + /**
  176 + * This 2-bit field indicates whether this Transport Stream packet header is followed by an
  177 + * adaptation field and/or payload (see Table 2-5).
  178 + *
  179 + * ITU-T Rec. H.222.0 | ISO/IEC 13818-1 decoders shall discard Transport Stream packets with the
  180 + * adaptation_field_control field set to a value of '00'. In the case of a null packet the value of the adaptation_field_control
  181 + * shall be set to '01'.
  182 + */
  183 + SrsTsAdaptationFieldType adaption_field_control; //2bits
  184 + /**
  185 + * The continuity_counter is a 4-bit field incrementing with each Transport Stream packet with the
  186 + * same PID. The continuity_counter wraps around to 0 after its maximum value. The continuity_counter shall not be
  187 + *incremented when the adaptation_field_control of the packet equals '00' or '10'.
  188 + *
  189 + * In Transport Streams, duplicate packets may be sent as two, and only two, consecutive Transport Stream packets of the
  190 + * same PID. The duplicate packets shall have the same continuity_counter value as the original packet and the
  191 + * adaptation_field_control field shall be equal to '01' or '11'. In duplicate packets each byte of the original packet shall be
  192 + * duplicated, with the exception that in the program clock reference fields, if present, a valid value shall be encoded.
  193 + *
  194 + * The continuity_counter in a particular Transport Stream packet is continuous when it differs by a positive value of one
  195 + * from the continuity_counter value in the previous Transport Stream packet of the same PID, or when either of the nonincrementing
  196 + * conditions (adaptation_field_control set to '00' or '10', or duplicate packets as described above) are met.
  197 + * The continuity counter may be discontinuous when the discontinuity_indicator is set to '1' (refer to 2.4.3.4). In the case of
  198 + * a null packet the value of the continuity_counter is undefined.
  199 + */
  200 + u_int8_t continuity_counter; //4bits
  201 +private:
  202 + SrsTsAdaptationField* adaptation_field;
  203 +public:
  204 + SrsTsPacket();
  205 + virtual ~SrsTsPacket();
  206 +public:
  207 +};
  208 +
  209 +/**
62 * write data from frame(header info) and buffer(data) to ts file. 210 * write data from frame(header info) and buffer(data) to ts file.
63 * it's a simple object wrapper for utility from nginx-rtmp: SrsMpegtsWriter 211 * it's a simple object wrapper for utility from nginx-rtmp: SrsMpegtsWriter
64 */ 212 */