正在显示
2 个修改的文件
包含
352 行增加
和
4 行删除
| @@ -402,6 +402,14 @@ SrsMpegtsFrame::SrsMpegtsFrame() | @@ -402,6 +402,14 @@ SrsMpegtsFrame::SrsMpegtsFrame() | ||
| 402 | 402 | ||
| 403 | SrsTsPacket::SrsTsPacket() | 403 | SrsTsPacket::SrsTsPacket() |
| 404 | { | 404 | { |
| 405 | + sync_byte = 0; | ||
| 406 | + transport_error_indicator = 0; | ||
| 407 | + payload_unit_start_indicator = 0; | ||
| 408 | + transport_priority = 0; | ||
| 409 | + pid = SrsTsPidPAT; | ||
| 410 | + transport_scrambling_control = SrsTsScrambledDisabled; | ||
| 411 | + adaption_field_control = SrsTsAdaptationFieldTypeReserved; | ||
| 412 | + continuity_counter = 0; | ||
| 405 | adaptation_field = NULL; | 413 | adaptation_field = NULL; |
| 406 | } | 414 | } |
| 407 | 415 | ||
| @@ -410,6 +418,46 @@ SrsTsPacket::~SrsTsPacket() | @@ -410,6 +418,46 @@ SrsTsPacket::~SrsTsPacket() | ||
| 410 | srs_freep(adaptation_field); | 418 | srs_freep(adaptation_field); |
| 411 | } | 419 | } |
| 412 | 420 | ||
| 421 | +SrsTsAdaptationField::SrsTsAdaptationField() | ||
| 422 | +{ | ||
| 423 | + adaption_field_length = 0; | ||
| 424 | + discontinuity_indicator = 0; | ||
| 425 | + random_access_indicator = 0; | ||
| 426 | + elementary_stream_priority_indicator = 0; | ||
| 427 | + PCR_flag = 0; | ||
| 428 | + OPCR_flag = 0; | ||
| 429 | + splicing_point_flag = 0; | ||
| 430 | + transport_private_data_flag = 0; | ||
| 431 | + adaptation_field_extension_flag = 0; | ||
| 432 | + program_clock_reference_base = 0; | ||
| 433 | + program_clock_reference_extension = 0; | ||
| 434 | + original_program_clock_reference_base = 0; | ||
| 435 | + original_program_clock_reference_extension = 0; | ||
| 436 | + splice_countdown = 0; | ||
| 437 | + transport_private_data_length = 0; | ||
| 438 | + transport_private_data = NULL; | ||
| 439 | + adaptation_field_extension_length = 0; | ||
| 440 | + ltw_flag = 0; | ||
| 441 | + piecewise_rate_flag = 0; | ||
| 442 | + seamless_splice_flag = 0; | ||
| 443 | + ltw_valid_flag = 0; | ||
| 444 | + ltw_offset = 0; | ||
| 445 | + piecewise_rate = 0; | ||
| 446 | + splice_type = 0; | ||
| 447 | + DTS_next_AU0 = 0; | ||
| 448 | + marker_bit0 = 0; | ||
| 449 | + DTS_next_AU1 = 0; | ||
| 450 | + marker_bit1 = 0; | ||
| 451 | + DTS_next_AU2 = 0; | ||
| 452 | + marker_bit2 = 0; | ||
| 453 | + nb_af_ext_reserved = 0; | ||
| 454 | + nb_af_reserved = 0; | ||
| 455 | +} | ||
| 456 | + | ||
| 457 | +SrsTsAdaptationField::~SrsTsAdaptationField() | ||
| 458 | +{ | ||
| 459 | +} | ||
| 460 | + | ||
| 413 | SrsTSMuxer::SrsTSMuxer(SrsFileWriter* w) | 461 | SrsTSMuxer::SrsTSMuxer(SrsFileWriter* w) |
| 414 | { | 462 | { |
| 415 | writer = w; | 463 | writer = w; |
| @@ -40,6 +40,7 @@ class SrsFileReader; | @@ -40,6 +40,7 @@ class SrsFileReader; | ||
| 40 | class SrsAvcAacCodec; | 40 | class SrsAvcAacCodec; |
| 41 | class SrsCodecSample; | 41 | class SrsCodecSample; |
| 42 | class SrsSimpleBuffer; | 42 | class SrsSimpleBuffer; |
| 43 | +class SrsTsAdaptationField; | ||
| 43 | 44 | ||
| 44 | // Transport Stream packets are 188 bytes in length. | 45 | // Transport Stream packets are 188 bytes in length. |
| 45 | #define SRS_TS_PACKET_SIZE 188 | 46 | #define SRS_TS_PACKET_SIZE 188 |
| @@ -106,10 +107,6 @@ enum SrsTsAdaptationFieldType | @@ -106,10 +107,6 @@ enum SrsTsAdaptationFieldType | ||
| 106 | SrsTsAdaptationFieldTypeBoth = 0x03, | 107 | SrsTsAdaptationFieldTypeBoth = 0x03, |
| 107 | }; | 108 | }; |
| 108 | 109 | ||
| 109 | -class SrsTsAdaptationField | ||
| 110 | -{ | ||
| 111 | -}; | ||
| 112 | - | ||
| 113 | /** | 110 | /** |
| 114 | * the packet in ts stream, | 111 | * the packet in ts stream, |
| 115 | * 2.4.3.2 Transport Stream packet layer, hls-mpeg-ts-iso13818-1.pdf, page 36 | 112 | * 2.4.3.2 Transport Stream packet layer, hls-mpeg-ts-iso13818-1.pdf, page 36 |
| @@ -118,11 +115,14 @@ class SrsTsAdaptationField | @@ -118,11 +115,14 @@ class SrsTsAdaptationField | ||
| 118 | class SrsTsPacket | 115 | class SrsTsPacket |
| 119 | { | 116 | { |
| 120 | private: | 117 | private: |
| 118 | + // 1B | ||
| 121 | /** | 119 | /** |
| 122 | * The sync_byte is a fixed 8-bit field whose value is '0100 0111' (0x47). Sync_byte emulation in the choice of | 120 | * 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. | 121 | * values for other regularly occurring fields, such as PID, should be avoided. |
| 124 | */ | 122 | */ |
| 125 | int8_t sync_byte; //8bits | 123 | int8_t sync_byte; //8bits |
| 124 | + | ||
| 125 | + // 2B | ||
| 126 | /** | 126 | /** |
| 127 | * The transport_error_indicator is a 1-bit flag. When set to '1' it indicates that at least | 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 | 128 | * 1 uncorrectable bit error exists in the associated Transport Stream packet. This bit may be set to '1' by entities external to |
| @@ -166,6 +166,8 @@ private: | @@ -166,6 +166,8 @@ private: | ||
| 166 | * Table 2-3). | 166 | * Table 2-3). |
| 167 | */ | 167 | */ |
| 168 | SrsTsPid pid; //13bits | 168 | SrsTsPid pid; //13bits |
| 169 | + | ||
| 170 | + // 1B | ||
| 169 | /** | 171 | /** |
| 170 | * This 2-bit field indicates the scrambling mode of the Transport Stream packet payload. | 172 | * 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 | 173 | * The Transport Stream packet header, and the adaptation field when present, shall not be scrambled. In the case of a null |
| @@ -207,6 +209,304 @@ public: | @@ -207,6 +209,304 @@ public: | ||
| 207 | }; | 209 | }; |
| 208 | 210 | ||
| 209 | /** | 211 | /** |
| 212 | +* the adaption field of ts packet. | ||
| 213 | +* 2.4.3.5 Semantic definition of fields in adaptation field, hls-mpeg-ts-iso13818-1.pdf, page 39 | ||
| 214 | +* Table 2-6 ¨C Transport Stream adaptation field, hls-mpeg-ts-iso13818-1.pdf, page 40 | ||
| 215 | +*/ | ||
| 216 | +class SrsTsAdaptationField | ||
| 217 | +{ | ||
| 218 | +private: | ||
| 219 | + // 1B | ||
| 220 | + /** | ||
| 221 | + * The adaptation_field_length is an 8-bit field specifying the number of bytes in the | ||
| 222 | + * adaptation_field immediately following the adaptation_field_length. The value 0 is for inserting a single stuffing byte in | ||
| 223 | + * a Transport Stream packet. When the adaptation_field_control value is '11', the value of the adaptation_field_length shall | ||
| 224 | + * be in the range 0 to 182. When the adaptation_field_control value is '10', the value of the adaptation_field_length shall | ||
| 225 | + * be 183. For Transport Stream packets carrying PES packets, stuffing is needed when there is insufficient PES packet data | ||
| 226 | + * to completely fill the Transport Stream packet payload bytes. Stuffing is accomplished by defining an adaptation field | ||
| 227 | + * longer than the sum of the lengths of the data elements in it, so that the payload bytes remaining after the adaptation field | ||
| 228 | + * exactly accommodates the available PES packet data. The extra space in the adaptation field is filled with stuffing bytes. | ||
| 229 | + * | ||
| 230 | + * This is the only method of stuffing allowed for Transport Stream packets carrying PES packets. For Transport Stream | ||
| 231 | + * packets carrying PSI, an alternative stuffing method is described in 2.4.4. | ||
| 232 | + */ | ||
| 233 | + u_int8_t adaption_field_length; //8bits | ||
| 234 | + // 1B | ||
| 235 | + /** | ||
| 236 | + * This is a 1-bit field which when set to '1' indicates that the discontinuity state is true for the | ||
| 237 | + * current Transport Stream packet. When the discontinuity_indicator is set to '0' or is not present, the discontinuity state is | ||
| 238 | + * false. The discontinuity indicator is used to indicate two types of discontinuities, system time-base discontinuities and | ||
| 239 | + * continuity_counter discontinuities. | ||
| 240 | + * | ||
| 241 | + * A system time-base discontinuity is indicated by the use of the discontinuity_indicator in Transport Stream packets of a | ||
| 242 | + * PID designated as a PCR_PID (refer to 2.4.4.9). When the discontinuity state is true for a Transport Stream packet of a | ||
| 243 | + * PID designated as a PCR_PID, the next PCR in a Transport Stream packet with that same PID represents a sample of a | ||
| 244 | + * new system time clock for the associated program. The system time-base discontinuity point is defined to be the instant | ||
| 245 | + * in time when the first byte of a packet containing a PCR of a new system time-base arrives at the input of the T-STD. | ||
| 246 | + * The discontinuity_indicator shall be set to '1' in the packet in which the system time-base discontinuity occurs. The | ||
| 247 | + * discontinuity_indicator bit may also be set to '1' in Transport Stream packets of the same PCR_PID prior to the packet | ||
| 248 | + * which contains the new system time-base PCR. In this case, once the discontinuity_indicator has been set to '1', it shall | ||
| 249 | + * continue to be set to '1' in all Transport Stream packets of the same PCR_PID up to and including the Transport Stream | ||
| 250 | + * packet which contains the first PCR of the new system time-base. After the occurrence of a system time-base | ||
| 251 | + * discontinuity, no fewer than two PCRs for the new system time-base shall be received before another system time-base | ||
| 252 | + * discontinuity can occur. Further, except when trick mode status is true, data from no more than two system time-bases | ||
| 253 | + * shall be present in the set of T-STD buffers for one program at any time. | ||
| 254 | + * | ||
| 255 | + * Prior to the occurrence of a system time-base discontinuity, the first byte of a Transport Stream packet which contains a | ||
| 256 | + * PTS or DTS which refers to the new system time-base shall not arrive at the input of the T-STD. After the occurrence of | ||
| 257 | + * a system time-base discontinuity, the first byte of a Transport Stream packet which contains a PTS or DTS which refers | ||
| 258 | + * to the previous system time-base shall not arrive at the input of the T-STD. | ||
| 259 | + * | ||
| 260 | + * A continuity_counter discontinuity is indicated by the use of the discontinuity_indicator in any Transport Stream packet. | ||
| 261 | + * When the discontinuity state is true in any Transport Stream packet of a PID not designated as a PCR_PID, the | ||
| 262 | + * continuity_counter in that packet may be discontinuous with respect to the previous Transport Stream packet of the same | ||
| 263 | + * PID. When the discontinuity state is true in a Transport Stream packet of a PID that is designated as a PCR_PID, the | ||
| 264 | + * continuity_counter may only be discontinuous in the packet in which a system time-base discontinuity occurs. A | ||
| 265 | + * continuity counter discontinuity point occurs when the discontinuity state is true in a Transport Stream packet and the | ||
| 266 | + * continuity_counter in the same packet is discontinuous with respect to the previous Transport Stream packet of the same | ||
| 267 | + * PID. A continuity counter discontinuity point shall occur at most one time from the initiation of the discontinuity state | ||
| 268 | + * until the conclusion of the discontinuity state. Furthermore, for all PIDs that are not designated as PCR_PIDs, when the | ||
| 269 | + * discontinuity_indicator is set to '1' in a packet of a specific PID, the discontinuity_indicator may be set to '1' in the next | ||
| 270 | + * Transport Stream packet of that same PID, but shall not be set to '1' in three consecutive Transport Stream packet of that | ||
| 271 | + * same PID. | ||
| 272 | + * | ||
| 273 | + * For the purpose of this clause, an elementary stream access point is defined as follows: | ||
| 274 | + * Video ¨C The first byte of a video sequence header. | ||
| 275 | + * Audio ¨C The first byte of an audio frame. | ||
| 276 | + * | ||
| 277 | + * After a continuity counter discontinuity in a Transport packet which is designated as containing elementary stream data, | ||
| 278 | + * the first byte of elementary stream data in a Transport Stream packet of the same PID shall be the first byte of an | ||
| 279 | + * elementary stream access point or in the case of video, the first byte of an elementary stream access point or a | ||
| 280 | + * sequence_end_code followed by an access point. Each Transport Stream packet which contains elementary stream data | ||
| 281 | + * with a PID not designated as a PCR_PID, and in which a continuity counter discontinuity point occurs, and in which a | ||
| 282 | + * PTS or DTS occurs, shall arrive at the input of the T-STD after the system time-base discontinuity for the associated | ||
| 283 | + * program occurs. In the case where the discontinuity state is true, if two consecutive Transport Stream packets of the same | ||
| 284 | + * PID occur which have the same continuity_counter value and have adaptation_field_control values set to '01' or '11', the | ||
| 285 | + * second packet may be discarded. A Transport Stream shall not be constructed in such a way that discarding such a packet | ||
| 286 | + * will cause the loss of PES packet payload data or PSI data. | ||
| 287 | + * | ||
| 288 | + * After the occurrence of a discontinuity_indicator set to '1' in a Transport Stream packet which contains PSI information, | ||
| 289 | + * a single discontinuity in the version_number of PSI sections may occur. At the occurrence of such a discontinuity, a | ||
| 290 | + * version of the TS_program_map_sections of the appropriate program shall be sent with section_length = = 13 and the | ||
| 291 | + * current_next_indicator = = 1, such that there are no program_descriptors and no elementary streams described. This shall | ||
| 292 | + * then be followed by a version of the TS_program_map_section for each affected program with the version_number | ||
| 293 | + * incremented by one and the current_next_indicator = = 1, containing a complete program definition. This indicates a | ||
| 294 | + * version change in PSI data. | ||
| 295 | + */ | ||
| 296 | + int8_t discontinuity_indicator; //1bit | ||
| 297 | + /** | ||
| 298 | + * The random_access_indicator is a 1-bit field that indicates that the current Transport | ||
| 299 | + * Stream packet, and possibly subsequent Transport Stream packets with the same PID, contain some information to aid | ||
| 300 | + * random access at this point. Specifically, when the bit is set to '1', the next PES packet to start in the payload of Transport | ||
| 301 | + * Stream packets with the current PID shall contain the first byte of a video sequence header if the PES stream type (refer | ||
| 302 | + * to Table 2-29) is 1 or 2, or shall contain the first byte of an audio frame if the PES stream type is 3 or 4. In addition, in | ||
| 303 | + * the case of video, a presentation timestamp shall be present in the PES packet containing the first picture following the | ||
| 304 | + * sequence header. In the case of audio, the presentation timestamp shall be present in the PES packet containing the first | ||
| 305 | + * byte of the audio frame. In the PCR_PID the random_access_indicator may only be set to '1' in Transport Stream packet | ||
| 306 | + * containing the PCR fields. | ||
| 307 | + */ | ||
| 308 | + int8_t random_access_indicator; //1bit | ||
| 309 | + /** | ||
| 310 | + * The elementary_stream_priority_indicator is a 1-bit field. It indicates, among | ||
| 311 | + * packets with the same PID, the priority of the elementary stream data carried within the payload of this Transport Stream | ||
| 312 | + * packet. A '1' indicates that the payload has a higher priority than the payloads of other Transport Stream packets. In the | ||
| 313 | + * case of video, this field may be set to '1' only if the payload contains one or more bytes from an intra-coded slice. A | ||
| 314 | + * value of '0' indicates that the payload has the same priority as all other packets which do not have this bit set to '1'. | ||
| 315 | + */ | ||
| 316 | + int8_t elementary_stream_priority_indicator; //1bit | ||
| 317 | + /** | ||
| 318 | + * The PCR_flag is a 1-bit flag. A value of '1' indicates that the adaptation_field contains a PCR field coded in | ||
| 319 | + * two parts. A value of '0' indicates that the adaptation field does not contain any PCR field. | ||
| 320 | + */ | ||
| 321 | + int8_t PCR_flag; //1bit | ||
| 322 | + /** | ||
| 323 | + * The OPCR_flag is a 1-bit flag. A value of '1' indicates that the adaptation_field contains an OPCR field | ||
| 324 | + * coded in two parts. A value of '0' indicates that the adaptation field does not contain any OPCR field. | ||
| 325 | + */ | ||
| 326 | + int8_t OPCR_flag; //1bit | ||
| 327 | + /** | ||
| 328 | + * The splicing_point_flag is a 1-bit flag. When set to '1', it indicates that a splice_countdown field | ||
| 329 | + * shall be present in the associated adaptation field, specifying the occurrence of a splicing point. A value of '0' indicates | ||
| 330 | + * that a splice_countdown field is not present in the adaptation field. | ||
| 331 | + */ | ||
| 332 | + int8_t splicing_point_flag; //1bit | ||
| 333 | + /** | ||
| 334 | + * The transport_private_data_flag is a 1-bit flag. A value of '1' indicates that the | ||
| 335 | + * adaptation field contains one or more private_data bytes. A value of '0' indicates the adaptation field does not contain any | ||
| 336 | + * private_data bytes. | ||
| 337 | + */ | ||
| 338 | + int8_t transport_private_data_flag; //1bit | ||
| 339 | + /** | ||
| 340 | + * The adaptation_field_extension_flag is a 1-bit field which when set to '1' indicates | ||
| 341 | + * the presence of an adaptation field extension. A value of '0' indicates that an adaptation field extension is not present in | ||
| 342 | + * the adaptation field. | ||
| 343 | + */ | ||
| 344 | + int8_t adaptation_field_extension_flag; //1bit | ||
| 345 | + | ||
| 346 | + // if PCR_flag, 6B | ||
| 347 | + /** | ||
| 348 | + * The program_clock_reference (PCR) is a | ||
| 349 | + * 42-bit field coded in two parts. The first part, program_clock_reference_base, is a 33-bit field whose value is given by | ||
| 350 | + * PCR_base(i), as given in equation 2-2. The second part, program_clock_reference_extension, is a 9-bit field whose value | ||
| 351 | + * is given by PCR_ext(i), as given in equation 2-3. The PCR indicates the intended time of arrival of the byte containing | ||
| 352 | + * the last bit of the program_clock_reference_base at the input of the system target decoder. | ||
| 353 | + */ | ||
| 354 | + int64_t program_clock_reference_base; //33bits | ||
| 355 | + //6bits reserved. | ||
| 356 | + int16_t program_clock_reference_extension; //9bits | ||
| 357 | + | ||
| 358 | + // if OPCR_flag, 6B | ||
| 359 | + /** | ||
| 360 | + * The optional original | ||
| 361 | + * program reference (OPCR) is a 42-bit field coded in two parts. These two parts, the base and the extension, are coded | ||
| 362 | + * identically to the two corresponding parts of the PCR field. The presence of the OPCR is indicated by the OPCR_flag. | ||
| 363 | + * The OPCR field shall be coded only in Transport Stream packets in which the PCR field is present. OPCRs are permitted | ||
| 364 | + * in both single program and multiple program Transport Streams. | ||
| 365 | + * | ||
| 366 | + * OPCR assists in the reconstruction of a single program Transport Stream from another Transport Stream. When | ||
| 367 | + * reconstructing the original single program Transport Stream, the OPCR may be copied to the PCR field. The resulting | ||
| 368 | + * PCR value is valid only if the original single program Transport Stream is reconstructed exactly in its entirety. This | ||
| 369 | + * would include at least any PSI and private data packets which were present in the original Transport Stream and would | ||
| 370 | + * possibly require other private arrangements. It also means that the OPCR must be an identical copy of its associated PCR | ||
| 371 | + * in the original single program Transport Stream. | ||
| 372 | + */ | ||
| 373 | + int64_t original_program_clock_reference_base; //33bits | ||
| 374 | + //6bits reserved. | ||
| 375 | + int16_t original_program_clock_reference_extension; //9bits | ||
| 376 | + | ||
| 377 | + // if splicing_point_flag, 1B | ||
| 378 | + /** | ||
| 379 | + * The splice_countdown is an 8-bit field, representing a value which may be positive or negative. A | ||
| 380 | + * positive value specifies the remaining number of Transport Stream packets, of the same PID, following the associated | ||
| 381 | + * Transport Stream packet until a splicing point is reached. Duplicate Transport Stream packets and Transport Stream | ||
| 382 | + * packets which only contain adaptation fields are excluded. The splicing point is located immediately after the last byte of | ||
| 383 | + * the Transport Stream packet in which the associated splice_countdown field reaches zero. In the Transport Stream packet | ||
| 384 | + * where the splice_countdown reaches zero, the last data byte of the Transport Stream packet payload shall be the last byte | ||
| 385 | + * of a coded audio frame or a coded picture. In the case of video, the corresponding access unit may or may not be | ||
| 386 | + * terminated by a sequence_end_code. Transport Stream packets with the same PID, which follow, may contain data from | ||
| 387 | + * a different elementary stream of the same type. | ||
| 388 | + * | ||
| 389 | + * The payload of the next Transport Stream packet of the same PID (duplicate packets and packets without payload being | ||
| 390 | + * excluded) shall commence with the first byte of a PES packet.In the case of audio, the PES packet payload shall | ||
| 391 | + * commence with an access point. In the case of video, the PES packet payload shall commence with an access point, or | ||
| 392 | + * with a sequence_end_code, followed by an access point. Thus, the previous coded audio frame or coded picture aligns | ||
| 393 | + * with the packet boundary, or is padded to make this so. Subsequent to the splicing point, the countdown field may also | ||
| 394 | + * be present. When the splice_countdown is a negative number whose value is minus n(-n), it indicates that the associated | ||
| 395 | + * Transport Stream packet is the n-th packet following the splicing point (duplicate packets and packets without payload | ||
| 396 | + * being excluded). | ||
| 397 | + * | ||
| 398 | + * For the purposes of this subclause, an access point is defined as follows: | ||
| 399 | + * Video ¨C The first byte of a video_sequence_header. | ||
| 400 | + * Audio ¨C The first byte of an audio frame. | ||
| 401 | + */ | ||
| 402 | + int8_t splice_countdown; //8bits | ||
| 403 | + | ||
| 404 | + // if transport_private_data_flag, 1+p[0] B | ||
| 405 | + /** | ||
| 406 | + * The transport_private_data_length is an 8-bit field specifying the number of | ||
| 407 | + * private_data bytes immediately following the transport private_data_length field. The number of private_data bytes shall | ||
| 408 | + * not be such that private data extends beyond the adaptation field. | ||
| 409 | + */ | ||
| 410 | + u_int8_t transport_private_data_length; //8bits | ||
| 411 | + char* transport_private_data; //[transport_private_data_length]bytes | ||
| 412 | + | ||
| 413 | + // if adaptation_field_extension_flag, 2+x B | ||
| 414 | + /** | ||
| 415 | + * The adaptation_field_extension_length is an 8-bit field. It indicates the number of | ||
| 416 | + * bytes of the extended adaptation field data immediately following this field, including reserved bytes if present. | ||
| 417 | + */ | ||
| 418 | + u_int8_t adaptation_field_extension_length; //8bits | ||
| 419 | + /** | ||
| 420 | + * This is a 1-bit field which when set to '1' indicates the presence of the ltw_offset | ||
| 421 | + * field. | ||
| 422 | + */ | ||
| 423 | + int8_t ltw_flag; //1bit | ||
| 424 | + /** | ||
| 425 | + * This is a 1-bit field which when set to '1' indicates the presence of the piecewise_rate field. | ||
| 426 | + */ | ||
| 427 | + int8_t piecewise_rate_flag; //1bit | ||
| 428 | + /** | ||
| 429 | + * This is a 1-bit flag which when set to '1' indicates that the splice_type and DTS_next_AU fields | ||
| 430 | + * are present. A value of '0' indicates that neither splice_type nor DTS_next_AU fields are present. This field shall not be | ||
| 431 | + * set to '1' in Transport Stream packets in which the splicing_point_flag is not set to '1'. Once it is set to '1' in a Transport | ||
| 432 | + * Stream packet in which the splice_countdown is positive, it shall be set to '1' in all the subsequent Transport Stream | ||
| 433 | + * packets of the same PID that have the splicing_point_flag set to '1', until the packet in which the splice_countdown | ||
| 434 | + * reaches zero (including this packet). When this flag is set, if the elementary stream carried in this PID is an audio stream, | ||
| 435 | + * the splice_type field shall be set to '0000'. If the elementary stream carried in this PID is a video stream, it shall fulfil the | ||
| 436 | + * constraints indicated by the splice_type value. | ||
| 437 | + */ | ||
| 438 | + int8_t seamless_splice_flag; //1bit | ||
| 439 | + //5bits reserved | ||
| 440 | + // if ltw_flag, 2B | ||
| 441 | + /** | ||
| 442 | + * (legal time window_valid_flag) ¨C This is a 1-bit field which when set to '1' indicates that the value of the | ||
| 443 | + * ltw_offset shall be valid. A value of '0' indicates that the value in the ltw_offset field is undefined. | ||
| 444 | + */ | ||
| 445 | + int8_t ltw_valid_flag; //1bit | ||
| 446 | + /** | ||
| 447 | + * (legal time window offset) ¨C This is a 15-bit field, the value of which is defined only if the ltw_valid flag has | ||
| 448 | + * a value of '1'. When defined, the legal time window offset is in units of (300/fs) seconds, where fs is the system clock | ||
| 449 | + * frequency of the program that this PID belongs to, and fulfils: | ||
| 450 | + * offset = t1(i) ¨C t(i) | ||
| 451 | + * ltw_offset = offset//1 | ||
| 452 | + * where i is the index of the first byte of this Transport Stream packet, offset is the value encoded in this field, t(i) is the | ||
| 453 | + * arrival time of byte i in the T-STD, and t1(i) is the upper bound in time of a time interval called the Legal Time Window | ||
| 454 | + * which is associated with this Transport Stream packet. | ||
| 455 | + */ | ||
| 456 | + int16_t ltw_offset; //15bits | ||
| 457 | + // if piecewise_rate_flag, 3B | ||
| 458 | + //2bits reserved | ||
| 459 | + /** | ||
| 460 | + * The meaning of this 22-bit field is only defined when both the ltw_flag and the ltw_valid_flag are set | ||
| 461 | + * to '1'. When defined, it is a positive integer specifying a hypothetical bitrate R which is used to define the end times of | ||
| 462 | + * the Legal Time Windows of Transport Stream packets of the same PID that follow this packet but do not include the | ||
| 463 | + * legal_time_window_offset field. | ||
| 464 | + */ | ||
| 465 | + int32_t piecewise_rate; //22bits | ||
| 466 | + // if seamless_splice_flag, 5B | ||
| 467 | + /** | ||
| 468 | + * This is a 4-bit field. From the first occurrence of this field onwards, it shall have the same value in all the | ||
| 469 | + * subsequent Transport Stream packets of the same PID in which it is present, until the packet in which the | ||
| 470 | + * splice_countdown reaches zero (including this packet). If the elementary stream carried in that PID is an audio stream, | ||
| 471 | + * this field shall have the value '0000'. If the elementary stream carried in that PID is a video stream, this field indicates the | ||
| 472 | + * conditions that shall be respected by this elementary stream for splicing purposes. These conditions are defined as a | ||
| 473 | + * function of profile, level and splice_type in Table 2-7 through Table 2-16. | ||
| 474 | + */ | ||
| 475 | + int8_t splice_type; //4bits | ||
| 476 | + /** | ||
| 477 | + * (decoding time stamp next access unit) ¨C This is a 33-bit field, coded in three parts. In the case of | ||
| 478 | + * continuous and periodic decoding through this splicing point it indicates the decoding time of the first access unit | ||
| 479 | + * following the splicing point. This decoding time is expressed in the time base which is valid in the Transport Stream | ||
| 480 | + * packet in which the splice_countdown reaches zero. From the first occurrence of this field onwards, it shall have the | ||
| 481 | + * same value in all the subsequent Transport Stream packets of the same PID in which it is present, until the packet in | ||
| 482 | + * which the splice_countdown reaches zero (including this packet). | ||
| 483 | + */ | ||
| 484 | + int8_t DTS_next_AU0; //3bits | ||
| 485 | + int8_t marker_bit0; //1bit | ||
| 486 | + int16_t DTS_next_AU1; //15bits | ||
| 487 | + int8_t marker_bit1; //1bit | ||
| 488 | + int16_t DTS_next_AU2; //15bits | ||
| 489 | + int8_t marker_bit2; //1bit | ||
| 490 | + // left bytes. | ||
| 491 | + /** | ||
| 492 | + * This is a fixed 8-bit value equal to '1111 1111' that can be inserted by the encoder. It is discarded by the | ||
| 493 | + * decoder. | ||
| 494 | + */ | ||
| 495 | + int nb_af_ext_reserved; | ||
| 496 | + | ||
| 497 | + // left bytes. | ||
| 498 | + /** | ||
| 499 | + * This is a fixed 8-bit value equal to '1111 1111' that can be inserted by the encoder. It is discarded by the | ||
| 500 | + * decoder. | ||
| 501 | + */ | ||
| 502 | + int nb_af_reserved; | ||
| 503 | +public: | ||
| 504 | + SrsTsAdaptationField(); | ||
| 505 | + virtual ~SrsTsAdaptationField(); | ||
| 506 | +public: | ||
| 507 | +}; | ||
| 508 | + | ||
| 509 | +/** | ||
| 210 | * write data from frame(header info) and buffer(data) to ts file. | 510 | * write data from frame(header info) and buffer(data) to ts file. |
| 211 | * it's a simple object wrapper for utility from nginx-rtmp: SrsMpegtsWriter | 511 | * it's a simple object wrapper for utility from nginx-rtmp: SrsMpegtsWriter |
| 212 | */ | 512 | */ |
-
请 注册 或 登录 后发表评论