- uint8_t *p = p_sys->buffer;
-
- while( p < &p_sys->buffer[i_size - 2] )
- {
- uint8_t h = *p++;
- int i_len = 0;
- int i_copy;
- int i_subseq = 0;
- int i_seqnum = 0;
- int i_offset = 0;
-
- if( (h&0xc0) == 0x40 )
- {
- /* Short header */
- p++;
- i_len = &p_sys->buffer[i_size] - p;
- }
- else
- {
- if( (h&0x40) == 0 )
- {
- i_subseq = (*p++)&0x7f;
- }
- i_len = (p[0] << 8)|p[1]; p += 2;
- if( (i_len&0xc000) == 0 )
- {
- i_len <<= 16;
- i_len |= (p[0] << 8)|p[1]; p += 2;
- i_len &= 0x3fffffff;
- }
- else
- {
- i_len &= 0x3fff;
- }
-
- i_offset = (p[0] << 8)|p[1]; p += 2;
- if( (i_offset&0xc000) == 0 )
- {
- i_offset <<= 16;
- i_offset |= (p[0] << 8)|p[1]; p += 2;
- i_offset &= 0x3fffffff;
- }
- else
- {
- i_offset &= 0x3fff;
- }
- i_seqnum = *p++;
- }
-
- i_copy = i_len - i_offset;
- if( i_copy > &p_sys->buffer[i_size] - p )
- {
- i_copy = &p_sys->buffer[i_size] - p;
- }
- else if( i_copy < 0 )
- {
- break;
- }
-
- msg_Dbg( p_demux, " - len=%d offset=%d size=%d subseq=%d seqnum=%d",
- i_len, i_offset, i_copy, i_subseq, i_seqnum );
-
- if( (h&0xc0) == 0x80 )
- {
- /* last fragment -> fixes */
- i_copy = i_offset;
- i_offset = i_len - i_copy;
- msg_Dbg( p_demux, "last fixing copy=%d offset=%d",
- i_copy, i_offset );
- }
-
- if( tk->p_frame &&
- ( tk->p_frame->i_dts != i_pts ||
- tk->i_frame != i_len ) )
- {
- msg_Dbg( p_demux, "sending size=%d", tk->p_frame->i_buffer );
-
- es_out_Send( p_demux->out, tk->p_es, tk->p_frame );
-
- tk->i_frame = 0;
- tk->p_frame = NULL;
- }
-
- if( (h&0xc0) != 0x80 && (h&0xc0) != 0x00 && !tk->p_frame )
- {
- /* no fragment */
- i_len = i_copy;
- i_offset = 0;
- }
-
-
- if( tk->p_frame == NULL )
- {
- msg_Dbg( p_demux, "new frame size=%d", i_len );
- tk->i_frame = i_len;
- if( !( tk->p_frame = block_New( p_demux, i_len + 8 + 1000) ) )
- {
- return -1;
- }
- memset( &tk->p_frame->p_buffer[8], 0, i_len );
- tk->p_frame->i_dts = i_pts;
- tk->p_frame->i_pts = i_pts;
-
- ((uint32_t*)tk->p_frame->p_buffer)[0] = i_len; /* len */
- ((uint32_t*)tk->p_frame->p_buffer)[1] = 0; /* chunk counts */
- }
-
- if( i_offset < tk->i_frame)
- {
- int i_ck = ((uint32_t*)tk->p_frame->p_buffer)[1]++;
-
- msg_Dbg( p_demux, "copying new buffer n=%d offset=%d copy=%d",
- i_ck, i_offset, i_copy );
-
- ((uint32_t*)(tk->p_frame->p_buffer+i_len+8))[i_ck*2 +0 ] = 1;
- ((uint32_t*)(tk->p_frame->p_buffer+i_len+8))[i_ck*2 +1 ] = i_offset;
-
-
- memcpy( &tk->p_frame->p_buffer[i_offset + 8], p, i_copy );
- }
-
- p += i_copy;
-
- if( (h&0xc0) != 0x80 )
- {
- break;
- }
-
-#if 0
- if( tk->p_frame )
- {
- /* append data */
- int i_ck = ((uint32_t*)tk->p_frame->p_buffer)[1]++;
-
- if( (h&0xc0) == 0x80 )
- {
- /* last fragment */
- i_copy = i_offset;
- i_offset = i_len - i_offset;
-
- ((uint32_t*)(tk->p_frame->p_buffer+i_len+8))[i_ck] = i_offset;
- memcpy( &tk->p_frame->p_buffer[i_offset+ 8], p, i_copy );
- p += i_copy;
-
- if( p_sys->i_pcr < tk->p_frame->i_dts )
- {
- p_sys->i_pcr = tk->p_frame->i_dts;
- es_out_Control( p_demux->out, ES_OUT_SET_PCR,
- (int64_t)p_sys->i_pcr );
- }
- es_out_Send( p_demux->out, tk->p_es, tk->p_frame );
-
- tk->i_frame = 0;
- tk->p_frame = NULL;
-
- continue;
- }
-
- ((uint32_t*)(tk->p_frame->p_buffer+i_len+8))[i_ck] = i_offset;
- memcpy( &tk->p_frame->p_buffer[i_offset + 8], p, i_copy );
- break;
- }
-
- if( (h&0xc0) != 0x00 )
- {
- block_t *p_frame;
-
- /* not fragmented */
- if( !( p_frame = block_New( p_demux, i_copy + 8 + 8 ) ) )
- {
- return -1;
- }
- p_frame->i_dts = i_pts;
- p_frame->i_pts = i_pts;
-
- ((uint32_t*)p_frame->p_buffer)[0] = i_copy;
- ((uint32_t*)p_frame->p_buffer)[1] = 1;
- ((uint32_t*)(p_frame->p_buffer+i_copy+8))[0] = 0;
- memcpy( &p_frame->p_buffer[8], p, i_copy );
-
- p += i_copy;
-
- if( p_sys->i_pcr < p_frame->i_dts )
- {
- p_sys->i_pcr = p_frame->i_dts;
- es_out_Control( p_demux->out, ES_OUT_SET_PCR,
- (int64_t)p_sys->i_pcr );
- }
- es_out_Send( p_demux->out, tk->p_es, p_frame );
- }
- else
- {
- /* First fragment */
- tk->i_frame = i_len;
- if( !( tk->p_frame = block_New( p_demux, i_len + 8 + 1000) ) )
- {
- return -1;
- }
- memset( &tk->p_frame->p_buffer[8], 0, i_len );
- tk->p_frame->i_dts = i_pts;
- tk->p_frame->i_pts = i_pts;
-
- ((uint32_t*)tk->p_frame->p_buffer)[0] = i_len; /* len */
- ((uint32_t*)tk->p_frame->p_buffer)[1] = 1; /* chunk counts */
- ((uint32_t*)(tk->p_frame->p_buffer+i_len+8))[0] = i_offset;
- memcpy( &tk->p_frame->p_buffer[i_offset + 8], p, i_copy );
-
- break;
- }
-#endif
- }