142
vlc_mutex_lock( &p_input->input.p_item->lock );
143
for( i = 0; i < p_input->input.p_item->i_categories; i++ )
145
vlc_mutex_lock( &p_input->p->input.p_item->lock );
146
for( i = 0; i < p_input->p->input.p_item->i_categories; i++ )
145
if( !strcmp( p_input->input.p_item->pp_categories[i]->psz_name,
148
if( !strcmp( p_input->p->input.p_item->pp_categories[i]->psz_name,
146
149
psz_cat ) ) break;
149
if( i == p_input->input.p_item->i_categories )
152
if( i == p_input->p->input.p_item->i_categories )
151
154
p_cat = malloc( sizeof( info_category_t ) );
154
vlc_mutex_lock( &p_input->input.p_item->lock );
157
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
155
158
return VLC_EGENERIC;
157
160
p_cat->psz_name = strdup( psz_cat );
158
161
p_cat->i_infos = 0;
159
162
p_cat->pp_infos = NULL;
160
INSERT_ELEM( p_input->input.p_item->pp_categories,
161
p_input->input.p_item->i_categories,
162
p_input->input.p_item->i_categories, p_cat );
163
INSERT_ELEM( p_input->p->input.p_item->pp_categories,
164
p_input->p->input.p_item->i_categories,
165
p_input->p->input.p_item->i_categories, p_cat );
165
p_cat = p_input->input.p_item->pp_categories[i];
168
p_cat = p_input->p->input.p_item->pp_categories[i];
167
170
for( i = 0; i < p_cat->i_infos; i++ )
203
212
char *psz_name = (char *)va_arg( args, char * );
205
214
info_category_t *p_cat = NULL;
208
vlc_mutex_lock( &p_input->input.p_item->lock );
209
for( i = 0; i < p_input->input.p_item->i_categories; i++ )
218
vlc_mutex_lock( &p_input->p->input.p_item->lock );
219
for( i_cat = 0; i_cat < p_input->p->input.p_item->i_categories; i_cat++ )
211
if( !strcmp( p_input->input.p_item->pp_categories[i]->psz_name,
221
if( !strcmp( p_input->p->input.p_item->pp_categories[i_cat]->psz_name,
214
p_cat = p_input->input.p_item->pp_categories[i];
224
p_cat = p_input->p->input.p_item->pp_categories[i_cat];
218
228
if( p_cat == NULL )
220
vlc_mutex_unlock( &p_input->input.p_item->lock );
230
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
221
231
return VLC_EGENERIC;
224
for( i = 0; i < p_cat->i_infos; i++ )
226
if( !strcmp( p_cat->pp_infos[i]->psz_name, psz_name ) )
236
/* Remove a specific info */
237
for( i = 0; i < p_cat->i_infos; i++ )
239
if( !strcmp( p_cat->pp_infos[i]->psz_name, psz_name ) )
241
free( p_cat->pp_infos[i]->psz_name );
242
if( p_cat->pp_infos[i]->psz_value )
243
free( p_cat->pp_infos[i]->psz_value );
244
free( p_cat->pp_infos[i] );
245
REMOVE_ELEM( p_cat->pp_infos, p_cat->i_infos, i );
249
if( i >= p_cat->i_infos )
251
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
257
/* Remove the complete categorie */
258
for( i = 0; i < p_cat->i_infos; i++ )
228
260
free( p_cat->pp_infos[i]->psz_name );
229
261
if( p_cat->pp_infos[i]->psz_value )
230
262
free( p_cat->pp_infos[i]->psz_value );
231
263
free( p_cat->pp_infos[i] );
232
REMOVE_ELEM( p_cat->pp_infos, p_cat->i_infos, i );
236
vlc_mutex_unlock( &p_input->input.p_item->lock );
238
if( i >= p_cat->i_infos )
241
NotifyPlaylist( p_input );
265
if( p_cat->pp_infos )
266
free( p_cat->pp_infos );
267
REMOVE_ELEM( p_input->p->input.p_item->pp_categories, p_input->p->input.p_item->i_categories, i_cat );
269
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
271
if( !p_input->b_preparsing )
274
event.type = vlc_InputItemInfoChanged;
275
vlc_event_send( &p_input->p->input.p_item->event_manager, &event );
246
281
case INPUT_GET_INFO:
263
298
if( !psz_name ) return VLC_EGENERIC;
265
vlc_mutex_lock( &p_input->input.p_item->lock );
266
if( p_input->input.p_item->psz_name )
267
free( p_input->input.p_item->psz_name );
268
p_input->input.p_item->psz_name = strdup( psz_name );
269
vlc_mutex_unlock( &p_input->input.p_item->lock );
271
NotifyPlaylist( p_input );
300
vlc_mutex_lock( &p_input->p->input.p_item->lock );
301
if( p_input->p->input.p_item->psz_name )
302
free( p_input->p->input.p_item->psz_name );
303
p_input->p->input.p_item->psz_name = strdup( psz_name );
304
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
306
if( !p_input->b_preparsing )
309
event.type = vlc_InputItemNameChanged;
310
event.u.input_item_name_changed.new_name = psz_name;
311
vlc_event_send( &p_input->p->input.p_item->event_manager, &event );
273
313
return VLC_SUCCESS;
277
317
p_bkmk = (seekpoint_t *)va_arg( args, seekpoint_t * );
278
318
p_bkmk = vlc_seekpoint_Duplicate( p_bkmk );
280
vlc_mutex_lock( &p_input->input.p_item->lock );
320
vlc_mutex_lock( &p_input->p->input.p_item->lock );
281
321
if( !p_bkmk->psz_name )
283
asprintf( &p_bkmk->psz_name, _("Bookmark %i"),
284
p_input->i_bookmark );
323
if( asprintf( &p_bkmk->psz_name, _("Bookmark %i"),
324
p_input->p->i_bookmark ) == -1 )
325
p_bkmk->psz_name = NULL;
287
TAB_APPEND( p_input->i_bookmark, p_input->bookmark, p_bkmk );
328
TAB_APPEND( p_input->p->i_bookmark, p_input->p->bookmark, p_bkmk );
289
330
/* Reflect the changes on the object var */
290
331
var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );
310
351
p_bkmk = (seekpoint_t *)va_arg( args, seekpoint_t * );
311
352
i_bkmk = (int)va_arg( args, int );
313
vlc_mutex_lock( &p_input->input.p_item->lock );
314
if( i_bkmk < p_input->i_bookmark )
354
vlc_mutex_lock( &p_input->p->input.p_item->lock );
355
if( i_bkmk < p_input->p->i_bookmark )
316
357
vlc_value_t val, text;
319
p_input->bookmark[i_bkmk] = p_bkmk;
360
p_input->p->bookmark[i_bkmk] = p_bkmk;
321
362
/* Reflect the changes on the object var */
322
363
var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );
323
for( i = 0; i < p_input->i_bookmark; i++ )
364
for( i = 0; i < p_input->p->i_bookmark; i++ )
326
text.psz_string = p_input->bookmark[i]->psz_name;
367
text.psz_string = p_input->p->bookmark[i]->psz_name;
327
368
var_Change( p_input, "bookmark", VLC_VAR_ADDCHOICE,
331
vlc_mutex_unlock( &p_input->input.p_item->lock );
372
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
333
374
UpdateBookmarksOption( p_input );
337
378
case INPUT_DEL_BOOKMARK:
338
379
i_bkmk = (int)va_arg( args, int );
340
vlc_mutex_lock( &p_input->input.p_item->lock );
341
if( i_bkmk < p_input->i_bookmark )
381
vlc_mutex_lock( &p_input->p->input.p_item->lock );
382
if( i_bkmk < p_input->p->i_bookmark )
343
384
vlc_value_t val, text;
346
p_bkmk = p_input->bookmark[i_bkmk];
347
TAB_REMOVE( p_input->i_bookmark, p_input->bookmark,
387
p_bkmk = p_input->p->bookmark[i_bkmk];
388
TAB_REMOVE( p_input->p->i_bookmark, p_input->p->bookmark,
349
390
vlc_seekpoint_Delete( p_bkmk );
351
392
/* Reflect the changes on the object var */
352
393
var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );
353
for( i = 0; i < p_input->i_bookmark; i++ )
394
for( i = 0; i < p_input->p->i_bookmark; i++ )
356
text.psz_string = p_input->bookmark[i]->psz_name;
397
text.psz_string = p_input->p->bookmark[i]->psz_name;
357
398
var_Change( p_input, "bookmark", VLC_VAR_ADDCHOICE,
360
vlc_mutex_unlock( &p_input->input.p_item->lock );
401
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
362
403
UpdateBookmarksOption( p_input );
364
405
return VLC_SUCCESS;
366
vlc_mutex_unlock( &p_input->input.p_item->lock );
407
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
368
409
return VLC_EGENERIC;
371
412
ppp_bkmk = (seekpoint_t ***)va_arg( args, seekpoint_t *** );
372
413
pi_bkmk = (int *)va_arg( args, int * );
374
vlc_mutex_lock( &p_input->input.p_item->lock );
375
if( p_input->i_bookmark )
415
vlc_mutex_lock( &p_input->p->input.p_item->lock );
416
if( p_input->p->i_bookmark )
379
*pi_bkmk = p_input->i_bookmark;
420
*pi_bkmk = p_input->p->i_bookmark;
380
421
*ppp_bkmk = malloc( sizeof(seekpoint_t *) *
381
p_input->i_bookmark );
382
for( i = 0; i < p_input->i_bookmark; i++ )
422
p_input->p->i_bookmark );
423
for( i = 0; i < p_input->p->i_bookmark; i++ )
385
vlc_seekpoint_Duplicate(p_input->bookmark[i]);
426
vlc_seekpoint_Duplicate(p_input->p->bookmark[i]);
388
vlc_mutex_unlock( &p_input->input.p_item->lock );
429
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
389
430
return VLC_SUCCESS;
393
434
*ppp_bkmk = NULL;
396
vlc_mutex_unlock( &p_input->input.p_item->lock );
437
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
397
438
return VLC_EGENERIC;
401
442
case INPUT_CLEAR_BOOKMARKS:
403
vlc_mutex_lock( &p_input->input.p_item->lock );
404
if( p_input->i_bookmark )
444
vlc_mutex_lock( &p_input->p->input.p_item->lock );
445
if( p_input->p->i_bookmark )
408
for( i = p_input->i_bookmark - 1; i >= 0; i-- )
449
for( i = p_input->p->i_bookmark - 1; i >= 0; i-- )
410
p_bkmk = p_input->bookmark[i];
411
TAB_REMOVE( p_input->i_bookmark, p_input->bookmark,
451
p_bkmk = p_input->p->bookmark[i];
452
TAB_REMOVE( p_input->p->i_bookmark, p_input->p->bookmark,
413
454
vlc_seekpoint_Delete( p_bkmk );
415
456
var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );
417
vlc_mutex_unlock( &p_input->input.p_item->lock );
458
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
419
460
UpdateBookmarksOption( p_input );
423
464
case INPUT_SET_BOOKMARK:
424
465
i_bkmk = (int)va_arg( args, int );
426
vlc_mutex_lock( &p_input->input.p_item->lock );
427
if( i_bkmk >= 0 && i_bkmk < p_input->i_bookmark )
467
vlc_mutex_lock( &p_input->p->input.p_item->lock );
468
if( i_bkmk >= 0 && i_bkmk < p_input->p->i_bookmark )
432
if( p_input->bookmark[i_bkmk]->i_time_offset != -1 )
473
if( p_input->p->bookmark[i_bkmk]->i_time_offset != -1 )
434
pos.i_time = p_input->bookmark[i_bkmk]->i_time_offset;
475
pos.i_time = p_input->p->bookmark[i_bkmk]->i_time_offset;
435
476
i_ret = var_Set( p_input, "time", pos );
437
else if( p_input->bookmark[i_bkmk]->i_byte_offset != -1 )
478
else if( p_input->p->bookmark[i_bkmk]->i_byte_offset != -1 )
439
480
// don't crash on bookmarks in live streams
440
if( stream_Size( p_input->input.p_stream ) == 0 )
481
if( stream_Size( p_input->p->input.p_stream ) == 0 )
442
vlc_mutex_unlock( &p_input->input.p_item->lock );
483
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
443
484
return VLC_EGENERIC;
445
pos.f_float = !p_input->input.p_stream ? 0 :
446
p_input->bookmark[i_bkmk]->i_byte_offset /
447
stream_Size( p_input->input.p_stream );
486
pos.f_float = !p_input->p->input.p_stream ? 0 :
487
p_input->p->bookmark[i_bkmk]->i_byte_offset /
488
stream_Size( p_input->p->input.p_stream );
448
489
i_ret = var_Set( p_input, "position", pos );
467
508
case INPUT_ADD_OPTION:
469
char *psz_option = (char *)va_arg( args, char * );
470
char *psz_value = (char *)va_arg( args, char * );
510
const char *psz_option = va_arg( args, const char * );
511
const char *psz_value = va_arg( args, const char * );
473
vlc_mutex_lock( &p_input->input.p_item->lock );
474
/* Check if option already exists */
475
for( i = 0; i < p_input->input.p_item->i_options; i++ )
477
if( !strncmp( p_input->input.p_item->ppsz_options[i],
478
psz_option, strlen( psz_option ) ) &&
479
p_input->input.p_item->ppsz_options[i][strlen(psz_option)]
482
free( p_input->input.p_item->ppsz_options[i] );
486
if( i == p_input->input.p_item->i_options )
488
p_input->input.p_item->i_options++;
489
p_input->input.p_item->ppsz_options =
490
realloc( p_input->input.p_item->ppsz_options,
491
p_input->input.p_item->i_options *
495
asprintf( &p_input->input.p_item->ppsz_options[i],
496
"%s=%s", psz_option, psz_value ) ;
497
vlc_mutex_unlock( &p_input->input.p_item->lock );
515
if( asprintf( &str, "%s=%s", psz_option, psz_value ) == -1 )
518
i = input_item_AddOpt( p_input->p->input.p_item, str,
519
VLC_INPUT_OPTION_UNIQUE );
502
524
case INPUT_GET_BYTE_POSITION:
503
525
pi_64 = (int64_t*)va_arg( args, int64_t * );
504
*pi_64 = !p_input->input.p_stream ? 0 :
505
stream_Tell( p_input->input.p_stream );
526
*pi_64 = !p_input->p->input.p_stream ? 0 :
527
stream_Tell( p_input->p->input.p_stream );
506
528
return VLC_SUCCESS;
508
530
case INPUT_SET_BYTE_SIZE:
509
531
pi_64 = (int64_t*)va_arg( args, int64_t * );
510
*pi_64 = !p_input->input.p_stream ? 0 :
511
stream_Size( p_input->input.p_stream );
532
*pi_64 = !p_input->p->input.p_stream ? 0 :
533
stream_Size( p_input->p->input.p_stream );
536
case INPUT_GET_VIDEO_FPS:
539
pf = (double*)va_arg( args, double * );
540
vlc_mutex_lock( &p_input->p->input.p_item->lock );
541
*pf = p_input->p->input.f_fps;
542
for( i = 0; i < p_input->p->i_slave && *pf <= 0.001; i++ )
543
*pf = p_input->p->slave[i]->f_fps;
544
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
514
548
case INPUT_ADD_SLAVE:
515
549
psz = (char*)va_arg( args, char * );
521
555
return VLC_SUCCESS;
557
case INPUT_GET_ATTACHMENTS: /* arg1=input_attachment_t***, arg2=int* res=can fail */
559
input_attachment_t ***ppp_attachment = (input_attachment_t***)va_arg( args, input_attachment_t *** );
560
int *pi_attachment = (int*)va_arg( args, int * );
563
vlc_mutex_lock( &p_input->p->input.p_item->lock );
564
if( p_input->p->i_attachment <= 0 )
566
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
567
*ppp_attachment = NULL;
571
*pi_attachment = p_input->p->i_attachment;
572
*ppp_attachment = malloc( sizeof(input_attachment_t**) * p_input->p->i_attachment );
573
for( i = 0; i < p_input->p->i_attachment; i++ )
574
(*ppp_attachment)[i] = vlc_input_attachment_Duplicate( p_input->p->attachment[i] );
576
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
580
case INPUT_GET_ATTACHMENT: /* arg1=input_attachment_t**, arg2=char* res=can fail */
582
input_attachment_t **pp_attachment = (input_attachment_t**)va_arg( args, input_attachment_t ** );
583
const char *psz_name = (const char*)va_arg( args, const char * );
586
vlc_mutex_lock( &p_input->p->input.p_item->lock );
587
for( i = 0; i < p_input->p->i_attachment; i++ )
589
if( !strcmp( p_input->p->attachment[i]->psz_name, psz_name ) )
591
*pp_attachment = vlc_input_attachment_Duplicate( p_input->p->attachment[i] );
592
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
596
*pp_attachment = NULL;
597
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
524
603
msg_Err( p_input, "unknown query in input_vaControl" );
525
604
return VLC_EGENERIC;
529
static void NotifyPlaylist( input_thread_t *p_input )
531
playlist_t *p_playlist =
532
(playlist_t *)vlc_object_find( p_input, VLC_OBJECT_PLAYLIST,
536
var_SetInteger( p_playlist, "item-change",
537
p_input->input.p_item->i_id );
538
vlc_object_release( p_playlist );
542
608
static void UpdateBookmarksOption( input_thread_t *p_input )
544
610
int i, i_len = 0;
545
611
char *psz_value = NULL, *psz_next = NULL;
547
vlc_mutex_lock( &p_input->input.p_item->lock );
548
for( i = 0; i < p_input->i_bookmark; i++ )
550
asprintf( &psz_value, "{name=%s,bytes="I64Fd",time="I64Fd"}",
551
p_input->bookmark[i]->psz_name,
552
p_input->bookmark[i]->i_byte_offset,
553
p_input->bookmark[i]->i_time_offset/1000000 );
554
i_len += strlen( psz_value );
557
for( i = 0; i < p_input->i_bookmark; i++ )
559
if( !i ) psz_value = psz_next = malloc( i_len + p_input->i_bookmark );
561
sprintf( psz_next, "{name=%s,bytes="I64Fd",time="I64Fd"}",
562
p_input->bookmark[i]->psz_name,
563
p_input->bookmark[i]->i_byte_offset,
564
p_input->bookmark[i]->i_time_offset/1000000 );
566
psz_next += strlen( psz_next );
567
if( i < p_input->i_bookmark - 1)
569
*psz_next = ','; psz_next++;
572
vlc_mutex_unlock( &p_input->input.p_item->lock );
613
vlc_mutex_lock( &p_input->p->input.p_item->lock );
614
if( p_input->p->i_bookmark > 0 )
616
for( i = 0; i < p_input->p->i_bookmark; i++ )
618
i_len += snprintf( NULL, 0, "{name=%s,bytes=%"PRId64",time=%"PRId64"}",
619
p_input->p->bookmark[i]->psz_name,
620
p_input->p->bookmark[i]->i_byte_offset,
621
p_input->p->bookmark[i]->i_time_offset/1000000 );
623
psz_value = psz_next = malloc( i_len + p_input->p->i_bookmark );
625
for( i = 0; i < p_input->p->i_bookmark; i++ )
627
sprintf( psz_next, "{name=%s,bytes=%"PRId64",time=%"PRId64"}",
628
p_input->p->bookmark[i]->psz_name,
629
p_input->p->bookmark[i]->i_byte_offset,
630
p_input->p->bookmark[i]->i_time_offset/1000000 );
632
psz_next += strlen( psz_next );
633
if( i < p_input->p->i_bookmark - 1)
634
*psz_next = ','; psz_next++;
637
vlc_mutex_unlock( &p_input->p->input.p_item->lock );
574
639
input_Control( p_input, INPUT_ADD_OPTION, "bookmarks",
575
640
psz_value ? psz_value : "" );