struct node *Add(struct node *head1, struct node *head2) { int state = FindLength(head1) - FindLength(head2); struct node *sum = NULL; int carry = 0; sum = Add2(head1, head2, carry, state); return sum; }
bool FileStream::Modify(const char* fname) { Close(); if (!str->OpenRW(fname)) { return false; } #ifdef _DEBUG FileStreamPtrCount++; #endif opened = true; created = true; FindLength(); ExtractFileFromPath( filename, fname ); strlcpy( originalfile, fname, _MAX_PATH); Pos = 0; return true; }
bool FileStream::Open(const char* fname) { Close(); if (!file_exists(fname)) { return false; } if (!str->OpenRO(fname)) { return false; } #ifdef _DEBUG core->FileStreamPtrCount++; #endif opened = true; created = false; FindLength(); ExtractFileFromPath( filename, fname ); strncpy( originalfile, fname, _MAX_PATH); return true; }
/***************************************************************************** * Demux: *****************************************************************************/ static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; int i_ret, i_mux_rate; block_t *p_pkt; i_ret = ps_pkt_resynch( p_demux->s, p_sys->format, p_sys->b_have_pack ); if( i_ret < 0 ) { return VLC_DEMUXER_EOF; } else if( i_ret == 0 ) { if( !p_sys->b_lost_sync ) { msg_Warn( p_demux, "garbage at input from %"PRIu64", trying to resync...", vlc_stream_Tell(p_demux->s) ); NotifyDiscontinuity( p_sys->tk, p_demux->out ); } p_sys->b_lost_sync = true; return VLC_DEMUXER_SUCCESS; } if( p_sys->b_lost_sync ) msg_Warn( p_demux, "found sync code" ); p_sys->b_lost_sync = false; if( p_sys->i_length == VLC_TICK_INVALID && p_sys->b_seekable ) { if( !FindLength( p_demux ) ) return VLC_DEMUXER_EGENERIC; } if( ( p_pkt = ps_pkt_read( p_demux->s ) ) == NULL ) { return VLC_DEMUXER_EOF; } if( p_pkt->i_buffer < 4 ) { block_Release( p_pkt ); return VLC_DEMUXER_EGENERIC; } const uint8_t i_stream_id = p_pkt->p_buffer[3]; switch( i_stream_id ) { case PS_STREAM_ID_END_STREAM: block_Release( p_pkt ); break; case PS_STREAM_ID_PACK_HEADER: if( !ps_pkt_parse_pack( p_pkt, &p_sys->i_pack_scr, &i_mux_rate ) ) { if( p_sys->i_first_scr == VLC_TICK_INVALID ) p_sys->i_first_scr = p_sys->i_pack_scr; CheckPCR( p_sys, p_demux->out, p_sys->i_pack_scr ); p_sys->i_scr = p_sys->i_pack_scr; p_sys->i_lastpack_byte = vlc_stream_Tell( p_demux->s ); if( !p_sys->b_have_pack ) p_sys->b_have_pack = true; /* done later on to work around bad vcd/svcd streams */ /* es_out_SetPCR( p_demux->out, p_sys->i_scr ); */ if( i_mux_rate > 0 ) p_sys->i_mux_rate = i_mux_rate; } block_Release( p_pkt ); break; case PS_STREAM_ID_SYSTEM_HEADER: if( !ps_pkt_parse_system( p_pkt, &p_sys->psm, p_sys->tk ) ) { int i; for( i = 0; i < PS_TK_COUNT; i++ ) { ps_track_t *tk = &p_sys->tk[i]; if( !tk->b_configured && tk->fmt.i_cat != UNKNOWN_ES ) { if( tk->b_seen ) tk->es = es_out_Add( p_demux->out, &tk->fmt ); /* else create when seeing packet */ tk->b_configured = true; } } } block_Release( p_pkt ); break; case PS_STREAM_ID_MAP: if( p_sys->psm.i_version == 0xFFFF ) msg_Dbg( p_demux, "contains a PSM"); ps_psm_fill( &p_sys->psm, p_pkt, p_sys->tk, p_demux->out ); block_Release( p_pkt ); break; default: /* Reject non video/audio nor PES */ if( i_stream_id < 0xC0 || i_stream_id > 0xEF ) { block_Release( p_pkt ); break; } /* fallthrough */ case PS_STREAM_ID_PRIVATE_STREAM1: case PS_STREAM_ID_EXTENDED: { int i_id = ps_pkt_id( p_pkt ); /* Small heuristic to improve MLP detection from AOB */ if( i_id == 0xa001 && p_sys->i_aob_mlp_count < 500 ) { p_sys->i_aob_mlp_count++; } else if( i_id == 0xbda1 && p_sys->i_aob_mlp_count > 0 ) { p_sys->i_aob_mlp_count--; i_id = 0xa001; } bool b_new = false; ps_track_t *tk = &p_sys->tk[ps_id_to_tk(i_id)]; if( !tk->b_configured ) { if( !ps_track_fill( tk, &p_sys->psm, i_id, p_pkt, false ) ) { /* No PSM and no probing yet */ if( p_sys->format == PSMF_PS ) { if( tk->fmt.i_cat == VIDEO_ES ) tk->fmt.i_codec = VLC_CODEC_H264; #if 0 if( i_stream_id == PS_STREAM_ID_PRIVATE_STREAM1 ) { es_format_Change( &tk->fmt, AUDIO_ES, VLC_CODEC_ATRAC3P ); tk->fmt.audio.i_blockalign = 376; tk->fmt.audio.i_channels = 2; tk->fmt.audio.i_rate = 44100; } #endif } tk->es = es_out_Add( p_demux->out, &tk->fmt ); b_new = true; tk->b_configured = true; } else { msg_Dbg( p_demux, "es id=0x%x format unknown", i_id ); } } /* Late creation from system header */ if( !tk->b_seen && tk->b_configured && !tk->es && tk->fmt.i_cat != UNKNOWN_ES ) tk->es = es_out_Add( p_demux->out, &tk->fmt ); tk->b_seen = true; /* The popular VCD/SVCD subtitling WinSubMux does not * renumber the SCRs when merging subtitles into the PES */ if( tk->b_seen && !p_sys->b_bad_scr && ( tk->fmt.i_codec == VLC_CODEC_OGT || tk->fmt.i_codec == VLC_CODEC_CVD ) ) { p_sys->b_bad_scr = true; p_sys->i_first_scr = VLC_TICK_INVALID; } if( p_sys->i_pack_scr != VLC_TICK_INVALID && !p_sys->b_bad_scr ) { if( (tk->fmt.i_cat == AUDIO_ES || tk->fmt.i_cat == VIDEO_ES) && tk->i_first_pts != VLC_TICK_INVALID && tk->i_first_pts - p_sys->i_pack_scr > VLC_TICK_FROM_SEC(2)) { msg_Warn( p_demux, "Incorrect SCR timing offset by of %"PRId64 "ms, disabling", MS_FROM_VLC_TICK(tk->i_first_pts - p_sys->i_pack_scr) ); p_sys->b_bad_scr = true; /* Disable Offset SCR */ p_sys->i_first_scr = VLC_TICK_INVALID; } else es_out_SetPCR( p_demux->out, p_sys->i_pack_scr ); } if( tk->b_configured && tk->es && !ps_pkt_parse_pes( VLC_OBJECT(p_demux), p_pkt, tk->i_skip ) ) { if( tk->fmt.i_cat == AUDIO_ES || tk->fmt.i_cat == VIDEO_ES ) { if( !p_sys->b_bad_scr && p_sys->i_pack_scr != VLC_TICK_INVALID && p_pkt->i_pts != VLC_TICK_INVALID && p_sys->i_pack_scr > p_pkt->i_pts + VLC_TICK_FROM_MS(250) ) { msg_Warn( p_demux, "Incorrect SCR timing in advance of %" PRId64 "ms, disabling", MS_FROM_VLC_TICK(p_sys->i_pack_scr - p_pkt->i_pts) ); p_sys->b_bad_scr = true; p_sys->i_first_scr = VLC_TICK_INVALID; } if( (p_sys->b_bad_scr || !p_sys->b_have_pack) && !p_sys->i_scr_track_id ) { p_sys->i_scr_track_id = tk->i_id; } } if( ((!b_new && !p_sys->b_have_pack) || p_sys->b_bad_scr) && p_sys->i_scr_track_id == tk->i_id && p_pkt->i_pts != VLC_TICK_INVALID ) { /* A hack to sync the A/V on PES files. */ msg_Dbg( p_demux, "force SCR: %"PRId64, p_pkt->i_pts ); CheckPCR( p_sys, p_demux->out, p_pkt->i_pts ); p_sys->i_scr = p_pkt->i_pts; if( p_sys->i_first_scr == VLC_TICK_INVALID ) p_sys->i_first_scr = p_sys->i_scr; es_out_SetPCR( p_demux->out, p_pkt->i_pts ); } if( tk->fmt.i_codec == VLC_CODEC_TELETEXT && p_pkt->i_pts == VLC_TICK_INVALID && p_sys->i_scr != VLC_TICK_INVALID ) { /* Teletext may have missing PTS (ETSI EN 300 472 Annexe A) * In this case use the last SCR + 40ms */ p_pkt->i_pts = p_sys->i_scr + VLC_TICK_FROM_MS(40); } if( p_pkt->i_pts > p_sys->i_current_pts ) { p_sys->i_current_pts = p_pkt->i_pts; } if( tk->i_next_block_flags ) { p_pkt->i_flags = tk->i_next_block_flags; tk->i_next_block_flags = 0; } #if 0 if( tk->fmt.i_codec == VLC_CODEC_ATRAC3P ) { p_pkt->p_buffer += 14; p_pkt->i_buffer -= 14; } #endif es_out_Send( p_demux->out, tk->es, p_pkt ); } else { block_Release( p_pkt ); } p_sys->i_pack_scr = VLC_TICK_INVALID; } break; } demux_UpdateTitleFromStream( p_demux ); return VLC_DEMUXER_SUCCESS; }