+ else if( p_pkt->p_buffer[3] == 0xfd &&
+ p_pkt->i_buffer >= 9 &&
+ (p_pkt->p_buffer[6]&0xC0) == 0x80 && /* mpeg2 */
+ (p_pkt->p_buffer[7]&0x01) == 0x01 ) /* extension_flag */
+ {
+ /* ISO 13818 amendment 2 and SMPTE RP 227 */
+ const uint8_t i_flags = p_pkt->p_buffer[7];
+ unsigned int i_skip = 9;
+
+ /* Find PES extension */
+ if( (i_flags & 0x80 ) )
+ {
+ i_skip += 5; /* pts */
+ if( (i_flags & 0x40) )
+ i_skip += 5; /* dts */
+ }
+ if( (i_flags & 0x20 ) )
+ i_skip += 6;
+ if( (i_flags & 0x10 ) )
+ i_skip += 3;
+ if( (i_flags & 0x08 ) )
+ i_skip += 1;
+ if( (i_flags & 0x04 ) )
+ i_skip += 1;
+ if( (i_flags & 0x02 ) )
+ i_skip += 2;
+
+ if( i_skip < p_pkt->i_buffer && (p_pkt->p_buffer[i_skip]&0x01) )
+ {
+ const uint8_t i_flags2 = p_pkt->p_buffer[i_skip];
+
+ /* Find PES extension 2 */
+ i_skip += 1;
+ if( i_flags2 & 0x80 )
+ i_skip += 16;
+ if( (i_flags2 & 0x40) && i_skip < p_pkt->i_buffer )
+ i_skip += 1 + p_pkt->p_buffer[i_skip];
+ if( i_flags2 & 0x20 )
+ i_skip += 2;
+ if( i_flags2 & 0x10 )
+ i_skip += 2;
+
+ if( i_skip + 1 < p_pkt->i_buffer )
+ {
+ const int i_extension_field_length = p_pkt->p_buffer[i_skip]&0x7f;
+ if( i_extension_field_length >=1 )
+ {
+ int i_stream_id_extension_flag = (p_pkt->p_buffer[i_skip+1] >> 7)&0x1;
+ if( i_stream_id_extension_flag == 0 )
+ return 0xfd00 | (p_pkt->p_buffer[i_skip+1]&0x7f);
+ }
+ }
+ }
+ }