| | 252 | |
|---|
| | 253 | /* Play entry. */ |
|---|
| | 254 | /* Play a single item. */ |
|---|
| | 255 | static void |
|---|
| | 256 | vcdplayer_play_single_item( access_t * p_access, vcdinfo_itemid_t itemid) |
|---|
| | 257 | { |
|---|
| | 258 | vcdplayer_t *p_vcd = (vcdplayer_t *)p_access->p_sys; |
|---|
| | 259 | vcdinfo_obj_t *p_obj = p_vcd->vcd; |
|---|
| | 260 | |
|---|
| | 261 | dbg_print(INPUT_DBG_CALL, "called itemid.num: %d, itemid.type: %d\n", |
|---|
| | 262 | itemid.num, itemid.type); |
|---|
| | 263 | |
|---|
| | 264 | p_vcd->in_still = 0; |
|---|
| | 265 | |
|---|
| | 266 | switch (itemid.type) { |
|---|
| | 267 | case VCDINFO_ITEM_TYPE_SEGMENT: |
|---|
| | 268 | { |
|---|
| | 269 | vcdinfo_video_segment_type_t segtype |
|---|
| | 270 | = vcdinfo_get_video_type(p_obj, itemid.num); |
|---|
| | 271 | segnum_t num_segs = vcdinfo_get_num_segments(p_obj); |
|---|
| | 272 | |
|---|
| | 273 | dbg_print(INPUT_DBG_PBC, "%s (%d), itemid.num: %d\n", |
|---|
| | 274 | vcdinfo_video_type2str(p_obj, itemid.num), |
|---|
| | 275 | (int) segtype, itemid.num); |
|---|
| | 276 | |
|---|
| | 277 | if (itemid.num >= num_segs) return; |
|---|
| | 278 | _vcdplayer_set_segment(p_access, itemid.num); |
|---|
| | 279 | |
|---|
| | 280 | switch (segtype) |
|---|
| | 281 | { |
|---|
| | 282 | case VCDINFO_FILES_VIDEO_NTSC_STILL: |
|---|
| | 283 | case VCDINFO_FILES_VIDEO_NTSC_STILL2: |
|---|
| | 284 | case VCDINFO_FILES_VIDEO_PAL_STILL: |
|---|
| | 285 | case VCDINFO_FILES_VIDEO_PAL_STILL2: |
|---|
| | 286 | p_vcd->in_still = -5; |
|---|
| | 287 | break; |
|---|
| | 288 | default: |
|---|
| | 289 | p_vcd->in_still = 0; |
|---|
| | 290 | } |
|---|
| | 291 | |
|---|
| | 292 | break; |
|---|
| | 293 | } |
|---|
| | 294 | |
|---|
| | 295 | case VCDINFO_ITEM_TYPE_TRACK: |
|---|
| | 296 | dbg_print(INPUT_DBG_PBC, "track %d\n", itemid.num); |
|---|
| | 297 | if (itemid.num < 1 || itemid.num > p_vcd->i_tracks) return; |
|---|
| | 298 | _vcdplayer_set_track(p_access, itemid.num); |
|---|
| | 299 | break; |
|---|
| | 300 | |
|---|
| | 301 | case VCDINFO_ITEM_TYPE_ENTRY: |
|---|
| | 302 | { |
|---|
| | 303 | unsigned int num_entries = vcdinfo_get_num_entries(p_obj); |
|---|
| | 304 | dbg_print(INPUT_DBG_PBC, "entry %d\n", itemid.num); |
|---|
| | 305 | if (itemid.num >= num_entries) return; |
|---|
| | 306 | _vcdplayer_set_entry(p_access, itemid.num); |
|---|
| | 307 | break; |
|---|
| | 308 | } |
|---|
| | 309 | |
|---|
| | 310 | case VCDINFO_ITEM_TYPE_LID: |
|---|
| | 311 | LOG_ERR("%s\n", _("Should have converted p_vcd above")); |
|---|
| | 312 | break; |
|---|
| | 313 | |
|---|
| | 314 | case VCDINFO_ITEM_TYPE_NOTFOUND: |
|---|
| | 315 | dbg_print(INPUT_DBG_PBC, "play nothing\n"); |
|---|
| | 316 | p_vcd->i_lsn = p_vcd->end_lsn; |
|---|
| | 317 | return; |
|---|
| | 318 | |
|---|
| | 319 | default: |
|---|
| | 320 | LOG_ERR("item type %d not implemented.\n", itemid.type); |
|---|
| | 321 | return; |
|---|
| | 322 | } |
|---|
| | 323 | |
|---|
| | 324 | p_vcd->play_item = itemid; |
|---|
| | 325 | |
|---|
| | 326 | /* Some players like xine, have a fifo queue of audio and video buffers |
|---|
| | 327 | that need to be flushed when playing a new selection. */ |
|---|
| | 328 | /* if (p_vcd->flush_buffers) |
|---|
| | 329 | p_vcd->flush_buffers(); */ |
|---|
| | 330 | |
|---|
| | 331 | } |
|---|
| | 332 | |
|---|
| | 352 | } |
|---|
| | 353 | |
|---|
| | 354 | /* |
|---|
| | 355 | Get the next play-item in the list given in the LIDs. Note play-item |
|---|
| | 356 | here refers to list of play-items for a single LID It shouldn't be |
|---|
| | 357 | confused with a user's list of favorite things to play or the |
|---|
| | 358 | "next" field of a LID which moves us to a different LID. |
|---|
| | 359 | */ |
|---|
| | 360 | static bool |
|---|
| | 361 | _vcdplayer_inc_play_item(access_t *p_access) |
|---|
| | 362 | { |
|---|
| | 363 | vcdplayer_t *p_vcd = (vcdplayer_t *)p_access->p_sys; |
|---|
| | 364 | int noi; |
|---|
| | 365 | |
|---|
| | 366 | dbg_print(INPUT_DBG_CALL, "called pli: %d\n", p_vcd->pdi); |
|---|
| | 367 | |
|---|
| | 368 | if ( NULL == p_vcd || NULL == p_vcd->pxd.pld ) return false; |
|---|
| | 369 | |
|---|
| | 370 | noi = vcdinf_pld_get_noi(p_vcd->pxd.pld); |
|---|
| | 371 | |
|---|
| | 372 | if ( noi <= 0 ) return false; |
|---|
| | 373 | |
|---|
| | 374 | /* Handle delays like autowait or wait here? */ |
|---|
| | 375 | |
|---|
| | 376 | p_vcd->pdi++; |
|---|
| | 377 | |
|---|
| | 378 | if ( p_vcd->pdi < 0 || p_vcd->pdi >= noi ) return false; |
|---|
| | 379 | |
|---|
| | 380 | else { |
|---|
| | 381 | uint16_t trans_itemid_num=vcdinf_pld_get_play_item(p_vcd->pxd.pld, |
|---|
| | 382 | p_vcd->pdi); |
|---|
| | 383 | vcdinfo_itemid_t trans_itemid; |
|---|
| | 384 | |
|---|
| | 385 | if (VCDINFO_INVALID_ITEMID == trans_itemid_num) return false; |
|---|
| | 386 | |
|---|
| | 387 | vcdinfo_classify_itemid(trans_itemid_num, &trans_itemid); |
|---|
| | 388 | dbg_print(INPUT_DBG_PBC, " play-item[%d]: %s\n", |
|---|
| | 389 | p_vcd->pdi, vcdinfo_pin2str (trans_itemid_num)); |
|---|
| | 390 | vcdplayer_play_single_item(p_access, trans_itemid); |
|---|
| | 391 | return true; |
|---|
| | 392 | } |
|---|