| 118 | | p_sys->b_opened = VLC_FALSE; |
|---|
| 119 | | p_sys->t1 = p_sys->t2 = NULL; |
|---|
| 120 | | p_sys->w = p_sys->r = NULL; |
|---|
| 121 | | p_sys->i_w = 0; |
|---|
| 122 | | |
|---|
| 123 | | #ifdef WIN32 |
|---|
| 124 | | i_size = GetTempPath( 4095, buffer ); |
|---|
| 125 | | if( i_size <= 0 || i_size >= 4095 ) |
|---|
| 126 | | { |
|---|
| 127 | | if( getcwd( buffer, 4095 ) == NULL ) |
|---|
| 128 | | strcpy( buffer, "c:" ); |
|---|
| 129 | | } |
|---|
| 130 | | /* remove last \\ if any */ |
|---|
| 131 | | if( buffer[strlen(buffer)-1] == '\\' ) |
|---|
| 132 | | buffer[strlen(buffer)-1] = '\0'; |
|---|
| 133 | | |
|---|
| 134 | | asprintf( &p_sys->psz_tmp1, "%s\\vlc-timeshift-%d-%d-1.dat", |
|---|
| 135 | | buffer, GetCurrentProcessId(), p_access->i_object_id ); |
|---|
| 136 | | asprintf( &p_sys->psz_tmp2, "%s\\vlc-timeshift-%d-%d-2.dat", |
|---|
| 137 | | buffer, GetCurrentProcessId(), p_access->i_object_id ); |
|---|
| 138 | | #else |
|---|
| 139 | | asprintf( &p_sys->psz_tmp1, "/tmp/vlc-timeshift-%d-%d-1.dat", |
|---|
| 140 | | getpid(), p_access->i_object_id ); |
|---|
| 141 | | asprintf( &p_sys->psz_tmp2, "/tmp/vlc-timeshift-%d-%d-2.dat", |
|---|
| 142 | | getpid(), p_access->i_object_id ); |
|---|
| 143 | | #endif |
|---|
| | 137 | p_sys->i_write_size = 0; |
|---|
| | 138 | p_sys->i_files = 0; |
|---|
| | 139 | |
|---|
| | 140 | p_sys->p_read_list = NULL; |
|---|
| | 141 | p_sys->pp_read_last = &p_sys->p_read_list; |
|---|
| | 142 | p_sys->p_write_list = NULL; |
|---|
| | 143 | p_sys->pp_write_last = &p_sys->p_write_list; |
|---|
| | 144 | |
|---|
| | 145 | var_Create( p_access, "timeshift-dir", |
|---|
| | 146 | VLC_VAR_DIRECTORY | VLC_VAR_DOINHERIT ); |
|---|
| | 147 | var_Create( p_access, "timeshift-granularity", |
|---|
| | 148 | VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); |
|---|
| | 149 | p_sys->i_file_size = var_GetInteger( p_access, "timeshift-granularity" ); |
|---|
| | 150 | if( p_sys->i_file_size < 1 ) p_sys->i_file_size = 1; |
|---|
| | 151 | p_sys->i_file_size *= 1024 * 1024; /* In MBytes */ |
|---|
| | 152 | |
|---|
| | 153 | p_sys->psz_filename_base = GetTmpFilePath( p_access ); |
|---|
| | 154 | p_sys->psz_filename = malloc( strlen( p_sys->psz_filename_base ) + 1000 ); |
|---|
| 195 | | return block_FifoGet( p_sys->p_fifo ); |
|---|
| | 220 | p_block = block_FifoGet( p_sys->p_fifo ); |
|---|
| | 221 | //p_access->info.i_size -= p_block->i_buffer; |
|---|
| | 222 | return p_block; |
|---|
| | 223 | } |
|---|
| | 224 | |
|---|
| | 225 | /***************************************************************************** |
|---|
| | 226 | * |
|---|
| | 227 | *****************************************************************************/ |
|---|
| | 228 | static void Thread( access_t *p_access ) |
|---|
| | 229 | { |
|---|
| | 230 | access_sys_t *p_sys = p_access->p_sys; |
|---|
| | 231 | access_t *p_src = p_access->p_source; |
|---|
| | 232 | int i; |
|---|
| | 233 | |
|---|
| | 234 | while( !p_access->b_die ) |
|---|
| | 235 | { |
|---|
| | 236 | block_t *p_block; |
|---|
| | 237 | |
|---|
| | 238 | /* Get a new block from the source */ |
|---|
| | 239 | if( p_src->pf_block ) |
|---|
| | 240 | { |
|---|
| | 241 | p_block = p_src->pf_block( p_src ); |
|---|
| | 242 | |
|---|
| | 243 | if( p_block == NULL ) |
|---|
| | 244 | { |
|---|
| | 245 | if( p_src->info.b_eof ) break; |
|---|
| | 246 | msleep( 1000 ); |
|---|
| | 247 | continue; |
|---|
| | 248 | } |
|---|
| | 249 | } |
|---|
| | 250 | else |
|---|
| | 251 | { |
|---|
| | 252 | if( ( p_block = block_New( p_access, 2048 ) ) == NULL ) break; |
|---|
| | 253 | |
|---|
| | 254 | p_block->i_buffer = |
|---|
| | 255 | p_src->pf_read( p_src, p_block->p_buffer, 2048 ); |
|---|
| | 256 | |
|---|
| | 257 | if( p_block->i_buffer < 0 ) |
|---|
| | 258 | { |
|---|
| | 259 | block_Release( p_block ); |
|---|
| | 260 | if( p_block->i_buffer == 0 ) break; |
|---|
| | 261 | msleep( 1000 ); |
|---|
| | 262 | continue; |
|---|
| | 263 | } |
|---|
| | 264 | } |
|---|
| | 265 | |
|---|
| | 266 | /* Write block */ |
|---|
| | 267 | if( !p_sys->p_write_list && !p_sys->p_read_list && |
|---|
| | 268 | p_sys->p_fifo->i_size < TIMESHIFT_FIFO_MAX ) |
|---|
| | 269 | { |
|---|
| | 270 | /* If there isn't too much timeshifted data, |
|---|
| | 271 | * write directly to FIFO */ |
|---|
| | 272 | block_FifoPut( p_sys->p_fifo, p_block ); |
|---|
| | 273 | |
|---|
| | 274 | //p_access->info.i_size += p_block->i_buffer; |
|---|
| | 275 | //p_access->info.i_update |= INPUT_UPDATE_SIZE; |
|---|
| | 276 | |
|---|
| | 277 | /* Nothing else to do */ |
|---|
| | 278 | continue; |
|---|
| | 279 | } |
|---|
| | 280 | |
|---|
| | 281 | WriteBlockToFile( p_access, p_block ); |
|---|
| | 282 | block_Release( p_block ); |
|---|
| | 283 | |
|---|
| | 284 | /* Read from file to fill up the fifo */ |
|---|
| | 285 | while( p_sys->p_fifo->i_size < TIMESHIFT_FIFO_MIN && |
|---|
| | 286 | !p_access->b_die ) |
|---|
| | 287 | { |
|---|
| | 288 | p_block = ReadBlockFromFile( p_access ); |
|---|
| | 289 | if( !p_block ) break; |
|---|
| | 290 | block_FifoPut( p_sys->p_fifo, p_block ); |
|---|
| | 291 | } |
|---|
| | 292 | } |
|---|
| | 293 | |
|---|
| | 294 | msg_Dbg( p_access, "timeshift: EOF" ); |
|---|
| | 295 | |
|---|
| | 296 | /* Send dummy packet to avoid deadlock in TShiftBlock */ |
|---|
| | 297 | for( i = 0; i < 2; i++ ) |
|---|
| | 298 | { |
|---|
| | 299 | block_t *p_dummy = block_New( p_access, 128 ); |
|---|
| | 300 | p_dummy->i_flags |= BLOCK_FLAG_DISCONTINUITY; |
|---|
| | 301 | memset( p_dummy->p_buffer, 0, p_dummy->i_buffer ); |
|---|
| | 302 | block_FifoPut( p_sys->p_fifo, p_dummy ); |
|---|
| | 303 | } |
|---|
| | 304 | } |
|---|
| | 305 | |
|---|
| | 306 | /***************************************************************************** |
|---|
| | 307 | * NextFileWrite: |
|---|
| | 308 | *****************************************************************************/ |
|---|
| | 309 | static void NextFileWrite( access_t *p_access ) |
|---|
| | 310 | { |
|---|
| | 311 | access_sys_t *p_sys = p_access->p_sys; |
|---|
| | 312 | ts_entry_t *p_next; |
|---|
| | 313 | |
|---|
| | 314 | if( !p_sys->p_write_list ) |
|---|
| | 315 | { |
|---|
| | 316 | p_sys->i_write_size = 0; |
|---|
| | 317 | return; |
|---|
| | 318 | } |
|---|
| | 319 | |
|---|
| | 320 | p_next = p_sys->p_write_list->p_next; |
|---|
| | 321 | |
|---|
| | 322 | /* Put written file in read list */ |
|---|
| | 323 | if( p_sys->i_write_size < p_sys->i_file_size ) |
|---|
| | 324 | ftruncate( fileno( p_sys->p_write_list->file ), p_sys->i_write_size ); |
|---|
| | 325 | |
|---|
| | 326 | fseek( p_sys->p_write_list->file, 0, SEEK_SET ); |
|---|
| | 327 | *p_sys->pp_read_last = p_sys->p_write_list; |
|---|
| | 328 | p_sys->pp_read_last = &p_sys->p_write_list->p_next; |
|---|
| | 329 | p_sys->p_write_list->p_next = 0; |
|---|
| | 330 | |
|---|
| | 331 | /* Switch to next file to write */ |
|---|
| | 332 | p_sys->p_write_list = p_next; |
|---|
| | 333 | if( !p_sys->p_write_list ) p_sys->pp_write_last = &p_sys->p_write_list; |
|---|
| | 334 | |
|---|
| | 335 | p_sys->i_write_size = 0; |
|---|
| | 336 | } |
|---|
| | 337 | |
|---|
| | 338 | /***************************************************************************** |
|---|
| | 339 | * NextFileRead: |
|---|
| | 340 | *****************************************************************************/ |
|---|
| | 341 | static void NextFileRead( access_t *p_access ) |
|---|
| | 342 | { |
|---|
| | 343 | access_sys_t *p_sys = p_access->p_sys; |
|---|
| | 344 | ts_entry_t *p_next; |
|---|
| | 345 | |
|---|
| | 346 | if( !p_sys->p_read_list ) return; |
|---|
| | 347 | |
|---|
| | 348 | p_next = p_sys->p_read_list->p_next; |
|---|
| | 349 | |
|---|
| | 350 | /* Put read file in write list */ |
|---|
| | 351 | fseek( p_sys->p_read_list->file, 0, SEEK_SET ); |
|---|
| | 352 | *p_sys->pp_write_last = p_sys->p_read_list; |
|---|
| | 353 | p_sys->pp_write_last = &p_sys->p_read_list->p_next; |
|---|
| | 354 | p_sys->p_read_list->p_next = 0; |
|---|
| | 355 | |
|---|
| | 356 | /* Switch to next file to read */ |
|---|
| | 357 | p_sys->p_read_list = p_next; |
|---|
| | 358 | if( !p_sys->p_read_list ) p_sys->pp_read_last = &p_sys->p_read_list; |
|---|
| | 359 | } |
|---|
| | 360 | |
|---|
| | 361 | /***************************************************************************** |
|---|
| | 362 | * WriteBlockToFile: |
|---|
| | 363 | *****************************************************************************/ |
|---|
| | 364 | static int WriteBlockToFile( access_t *p_access, block_t *p_block ) |
|---|
| | 365 | { |
|---|
| | 366 | access_sys_t *p_sys = p_access->p_sys; |
|---|
| | 367 | int i_write, i_buffer; |
|---|
| | 368 | |
|---|
| | 369 | if( p_sys->i_write_size == p_sys->i_file_size ) NextFileWrite( p_access ); |
|---|
| | 370 | |
|---|
| | 371 | /* Open new file if necessary */ |
|---|
| | 372 | if( !p_sys->p_write_list ) |
|---|
| | 373 | { |
|---|
| | 374 | FILE *file; |
|---|
| | 375 | |
|---|
| | 376 | sprintf( p_sys->psz_filename, "%s%i.dat", |
|---|
| | 377 | p_sys->psz_filename_base, p_sys->i_files ); |
|---|
| | 378 | file = fopen( p_sys->psz_filename, "w+b" ); |
|---|
| | 379 | |
|---|
| | 380 | if( !file && p_sys->i_files < 2 ) |
|---|
| | 381 | { |
|---|
| | 382 | /* We just can't work with less than 2 buffer files */ |
|---|
| | 383 | msg_Err( p_access, "cannot open temporary file '%s' (%s)", |
|---|
| | 384 | p_sys->psz_filename, strerror(errno) ); |
|---|
| | 385 | return VLC_EGENERIC; |
|---|
| | 386 | } |
|---|
| | 387 | else if( !file ) return VLC_EGENERIC; |
|---|
| | 388 | |
|---|
| | 389 | p_sys->p_write_list = malloc( sizeof(ts_entry_t) ); |
|---|
| | 390 | p_sys->p_write_list->p_next = 0; |
|---|
| | 391 | p_sys->p_write_list->file = file; |
|---|
| | 392 | p_sys->pp_write_last = &p_sys->p_write_list->p_next; |
|---|
| | 393 | |
|---|
| | 394 | p_sys->i_files++; |
|---|
| | 395 | } |
|---|
| | 396 | |
|---|
| | 397 | /* Write to file */ |
|---|
| | 398 | i_buffer = __MIN( p_block->i_buffer, |
|---|
| | 399 | p_sys->i_file_size - p_sys->i_write_size ); |
|---|
| | 400 | |
|---|
| | 401 | i_write = fwrite( p_block->p_buffer, 1, i_buffer, |
|---|
| | 402 | p_sys->p_write_list->file ); |
|---|
| | 403 | |
|---|
| | 404 | if( i_write > 0 ) p_sys->i_write_size += i_write; |
|---|
| | 405 | |
|---|
| | 406 | //p_access->info.i_size += i_write; |
|---|
| | 407 | //p_access->info.i_update |= INPUT_UPDATE_SIZE; |
|---|
| | 408 | |
|---|
| | 409 | if( i_write < i_buffer ) |
|---|
| | 410 | { |
|---|
| | 411 | /* Looks like we're short of space */ |
|---|
| | 412 | |
|---|
| | 413 | if( !p_sys->p_write_list->p_next ) |
|---|
| | 414 | { |
|---|
| | 415 | msg_Warn( p_access, "no more space, overwritting old data" ); |
|---|
| | 416 | NextFileRead( p_access ); |
|---|
| | 417 | NextFileRead( p_access ); |
|---|
| | 418 | } |
|---|
| | 419 | |
|---|
| | 420 | /* Make sure we switch to next file in write list */ |
|---|
| | 421 | p_sys->i_write_size = p_sys->i_file_size; |
|---|
| | 422 | } |
|---|
| | 423 | |
|---|
| | 424 | p_block->p_buffer += i_write; |
|---|
| | 425 | p_block->i_buffer -= i_write; |
|---|
| | 426 | |
|---|
| | 427 | /* Check if we have some data left */ |
|---|
| | 428 | if( p_block->i_buffer ) return WriteBlockToFile( p_access, p_block ); |
|---|
| | 429 | |
|---|
| | 430 | return VLC_SUCCESS; |
|---|
| | 431 | } |
|---|
| | 432 | |
|---|
| | 433 | /***************************************************************************** |
|---|
| | 434 | * ReadBlockFromFile: |
|---|
| | 435 | *****************************************************************************/ |
|---|
| | 436 | static block_t *ReadBlockFromFile( access_t *p_access ) |
|---|
| | 437 | { |
|---|
| | 438 | access_sys_t *p_sys = p_access->p_sys; |
|---|
| | 439 | block_t *p_block; |
|---|
| | 440 | |
|---|
| | 441 | if( !p_sys->p_read_list && p_sys->p_write_list ) |
|---|
| | 442 | { |
|---|
| | 443 | /* Force switching to next write file, that should |
|---|
| | 444 | * give us something to read */ |
|---|
| | 445 | NextFileWrite( p_access ); |
|---|
| | 446 | } |
|---|
| | 447 | |
|---|
| | 448 | if( !p_sys->p_read_list ) return 0; |
|---|
| | 449 | |
|---|
| | 450 | p_block = block_New( p_access, 4096 ); |
|---|
| | 451 | p_block->i_buffer = fread( p_block->p_buffer, 1, 4096, |
|---|
| | 452 | p_sys->p_read_list->file ); |
|---|
| | 453 | |
|---|
| | 454 | if( p_block->i_buffer == 0 ) NextFileRead( p_access ); |
|---|
| | 455 | |
|---|
| | 456 | //p_access->info.i_size -= p_block->i_buffer; |
|---|
| | 457 | //p_access->info.i_update |= INPUT_UPDATE_SIZE; |
|---|
| | 458 | |
|---|
| | 459 | return p_block; |
|---|
| | 460 | } |
|---|
| | 461 | |
|---|
| | 462 | /***************************************************************************** |
|---|
| | 463 | * Seek: seek to a specific location in a file |
|---|
| | 464 | *****************************************************************************/ |
|---|
| | 465 | static int Seek( access_t *p_access, int64_t i_pos ) |
|---|
| | 466 | { |
|---|
| | 467 | //access_sys_t *p_sys = p_access->p_sys; |
|---|
| | 468 | return VLC_SUCCESS; |
|---|
| 257 | | * |
|---|
| 258 | | *****************************************************************************/ |
|---|
| 259 | | static void Thread( access_t *p_access ) |
|---|
| 260 | | { |
|---|
| 261 | | access_sys_t *p_sys = p_access->p_sys; |
|---|
| 262 | | access_t *p_src = p_access->p_source; |
|---|
| 263 | | int i_loop = 0; |
|---|
| 264 | | |
|---|
| 265 | | while( !p_access->b_die ) |
|---|
| 266 | | { |
|---|
| 267 | | block_t *p_block; |
|---|
| 268 | | |
|---|
| 269 | | /* Get a new block */ |
|---|
| 270 | | if( p_src->pf_block ) |
|---|
| 271 | | { |
|---|
| 272 | | p_block = p_src->pf_block( p_src ); |
|---|
| 273 | | |
|---|
| 274 | | if( p_block == NULL ) |
|---|
| 275 | | { |
|---|
| 276 | | if( p_src->info.b_eof ) |
|---|
| 277 | | break; |
|---|
| 278 | | |
|---|
| 279 | | msleep( 1000 ); |
|---|
| 280 | | continue; |
|---|
| 281 | | } |
|---|
| 282 | | } |
|---|
| 283 | | else |
|---|
| 284 | | { |
|---|
| 285 | | if( ( p_block = block_New( p_access, 2048 ) ) == NULL ) |
|---|
| 286 | | break; |
|---|
| 287 | | |
|---|
| 288 | | p_block->i_buffer = p_src->pf_read( p_src, p_block->p_buffer, 2048); |
|---|
| 289 | | if( p_block->i_buffer < 0 ) |
|---|
| 290 | | { |
|---|
| 291 | | block_Release( p_block ); |
|---|
| 292 | | if( p_block->i_buffer == 0 ) |
|---|
| 293 | | break; |
|---|
| 294 | | msleep( 1000 ); |
|---|
| 295 | | continue; |
|---|
| 296 | | } |
|---|
| 297 | | } |
|---|
| 298 | | |
|---|
| 299 | | /* Open dump files if we need them */ |
|---|
| 300 | | if( p_sys->p_fifo->i_size >= TIMESHIFT_FIFO_MAX && !p_sys->b_opened ) |
|---|
| 301 | | { |
|---|
| 302 | | msg_Dbg( p_access, "opening first temporary files (%s)", |
|---|
| 303 | | p_sys->psz_tmp1 ); |
|---|
| 304 | | |
|---|
| 305 | | p_sys->b_opened = VLC_TRUE; |
|---|
| 306 | | p_sys->t1 = p_sys->t2 = NULL; |
|---|
| 307 | | p_sys->w = p_sys->r = NULL; |
|---|
| 308 | | |
|---|
| 309 | | p_sys->t1 = fopen( p_sys->psz_tmp1, "w+b" ); |
|---|
| 310 | | if( p_sys->t1 ) |
|---|
| 311 | | { |
|---|
| 312 | | msg_Dbg( p_access, "opening second temporary files (%s)", |
|---|
| 313 | | p_sys->psz_tmp2 ); |
|---|
| 314 | | |
|---|
| 315 | | p_sys->t2 = fopen( p_sys->psz_tmp2, "w+b" ); |
|---|
| 316 | | if( p_sys->t2 ) |
|---|
| 317 | | { |
|---|
| 318 | | p_sys->w = p_sys->t1; |
|---|
| 319 | | p_sys->i_w = 0; |
|---|
| 320 | | |
|---|
| 321 | | msg_Dbg( p_access, "start writing into temporary file" ); |
|---|
| 322 | | } |
|---|
| 323 | | else |
|---|
| 324 | | { |
|---|
| 325 | | msg_Err( p_access, "cannot open temporary file '%s' (%s)", |
|---|
| 326 | | p_sys->psz_tmp2, strerror(errno) ); |
|---|
| 327 | | fclose( p_sys->t1 ); |
|---|
| 328 | | p_sys->t1 = NULL; |
|---|
| 329 | | } |
|---|
| 330 | | } |
|---|
| 331 | | else |
|---|
| 332 | | { |
|---|
| 333 | | msg_Err( p_access, "cannot open temporary file '%s' (%s)", |
|---|
| 334 | | p_sys->psz_tmp1, strerror(errno) ); |
|---|
| 335 | | } |
|---|
| 336 | | } |
|---|
| 337 | | |
|---|
| 338 | | if( p_sys->w ) |
|---|
| 339 | | { |
|---|
| 340 | | int i_write; |
|---|
| 341 | | |
|---|
| 342 | | /* Dump the block */ |
|---|
| 343 | | i_write = fwrite( p_block->p_buffer, 1, p_block->i_buffer, |
|---|
| 344 | | p_sys->w ); |
|---|
| 345 | | block_Release( p_block ); |
|---|
| 346 | | |
|---|
| 347 | | if( i_write > 0 ) |
|---|
| 348 | | p_sys->i_w += i_write; |
|---|
| 349 | | else |
|---|
| 350 | | msg_Warn( p_access, "cannot write data" ); |
|---|
| 351 | | |
|---|
| 352 | | /* Start reading from a file if fifo isn't at 25% */ |
|---|
| 353 | | if( p_sys->p_fifo->i_size < TIMESHIFT_FIFO_MIN && !p_sys->r ) |
|---|
| 354 | | { |
|---|
| 355 | | msg_Dbg( p_access, "start reading from temporary file (dumped=%d)", p_sys->i_w ); |
|---|
| 356 | | |
|---|
| 357 | | p_sys->r = p_sys->w; |
|---|
| 358 | | fseek( p_sys->r, 0, SEEK_SET ); |
|---|
| 359 | | |
|---|
| 360 | | p_sys->w = p_sys->t2; |
|---|
| 361 | | p_sys->i_w = 0; |
|---|
| 362 | | } |
|---|
| 363 | | |
|---|
| 364 | | if( p_sys->r ) |
|---|
| 365 | | { |
|---|
| 366 | | while( p_sys->p_fifo->i_size < TIMESHIFT_FIFO_MIN ) |
|---|
| 367 | | { |
|---|
| 368 | | p_block = block_New( p_access, 4096 ); |
|---|
| 369 | | p_block->i_buffer = fread( p_block->p_buffer, 1, 4096, |
|---|
| 370 | | p_sys->r ); |
|---|
| 371 | | |
|---|
| 372 | | if( p_block->i_buffer > 0 ) |
|---|
| 373 | | { |
|---|
| 374 | | block_FifoPut( p_sys->p_fifo, p_block ); |
|---|
| 375 | | } |
|---|
| 376 | | else if( p_sys->i_w > 32*1024) |
|---|
| 377 | | { |
|---|
| 378 | | FILE *tmp; |
|---|
| 379 | | block_Release( p_block ); |
|---|
| 380 | | |
|---|
| 381 | | msg_Dbg( p_access, "switching temporary files (dumped=%d)", p_sys->i_w ); |
|---|
| 382 | | |
|---|
| 383 | | /* Switch read/write */ |
|---|
| 384 | | tmp = p_sys->r; |
|---|
| 385 | | |
|---|
| 386 | | p_sys->r = p_sys->w; |
|---|
| 387 | | fseek( p_sys->r, 0, SEEK_SET ); |
|---|
| 388 | | |
|---|
| 389 | | p_sys->w = tmp; |
|---|
| 390 | | fseek( p_sys->w, 0, SEEK_SET ); |
|---|
| 391 | | ftruncate( fileno(p_sys->w), 0 ); |
|---|
| 392 | | p_sys->i_w = 0; |
|---|
| 393 | | } |
|---|
| 394 | | else |
|---|
| 395 | | { |
|---|
| 396 | | msg_Dbg( p_access, "removing temporary files" ); |
|---|
| 397 | | |
|---|
| 398 | | /* We will remove the need of tmp files */ |
|---|
| 399 | | if( p_sys->i_w > 0 ) |
|---|
| 400 | | { |
|---|
| 401 | | msg_Dbg( p_access, "loading temporary file" ); |
|---|
| 402 | | fseek( p_sys->w, 0, SEEK_SET ); |
|---|
| 403 | | for( ;; ) |
|---|
| 404 | | { |
|---|
| 405 | | p_block = block_New( p_access, 4096 ); |
|---|
| 406 | | p_block->i_buffer = fread( p_block->p_buffer, |
|---|
| 407 | | 1, 4096, |
|---|
| 408 | | p_sys->w ); |
|---|
| 409 | | if( p_block->i_buffer <= 0 ) |
|---|
| 410 | | { |
|---|
| 411 | | block_Release( p_block ); |
|---|
| 412 | | break; |
|---|
| 413 | | } |
|---|
| 414 | | block_FifoPut( p_sys->p_fifo, p_block ); |
|---|
| 415 | | } |
|---|
| 416 | | } |
|---|
| 417 | | |
|---|
| 418 | | p_sys->b_opened = VLC_FALSE; |
|---|
| 419 | | |
|---|
| 420 | | fclose( p_sys->t1 ); |
|---|
| 421 | | fclose( p_sys->t2 ); |
|---|
| 422 | | |
|---|
| 423 | | p_sys->t1 = p_sys->t2 = NULL; |
|---|
| 424 | | p_sys->w = p_sys->r = NULL; |
|---|
| 425 | | |
|---|
| 426 | | unlink( p_sys->psz_tmp1 ); |
|---|
| 427 | | unlink( p_sys->psz_tmp2 ); |
|---|
| 428 | | break; |
|---|
| 429 | | } |
|---|
| 430 | | } |
|---|
| 431 | | } |
|---|
| 432 | | } |
|---|
| 433 | | else if( p_sys->p_fifo->i_size < TIMESHIFT_FIFO_MAX ) |
|---|
| 434 | | { |
|---|
| 435 | | block_FifoPut( p_sys->p_fifo, p_block ); |
|---|
| 436 | | } |
|---|
| 437 | | else |
|---|
| 438 | | { |
|---|
| 439 | | /* We failed to opened files so trash new data */ |
|---|
| 440 | | block_Release( p_block ); |
|---|
| 441 | | } |
|---|
| 442 | | #if 0 |
|---|
| 443 | | if( (i_loop % 400) == 0 ) |
|---|
| 444 | | msg_Dbg( p_access, "timeshift: buff=%d", p_sys->p_fifo->i_size ); |
|---|
| | 528 | * GetTmpFilePath: |
|---|
| | 529 | *****************************************************************************/ |
|---|
| | 530 | #ifdef WIN32 |
|---|
| | 531 | #define getpid() GetCurrentProcessId() |
|---|