/* */
p_demux->p_sys = p_sys = calloc(1, sizeof(*p_sys));
- if (unlikely(!p_sys)) {
+ if (unlikely(!p_sys))
return VLC_ENOMEM;
- }
+
p_sys->current_overlay = -1;
p_sys->i_audio_stream = -1;
p_sys->i_video_stream = -1;
vlc_array_init(&p_sys->es);
p_sys->p_out = esOutNew( p_demux );
- if (unlikely(p_sys->p_out == NULL)) {
+ if (unlikely(p_sys->p_out == NULL))
goto error;
- }
blurayResetParser( p_demux );
if (!p_sys->p_parser) {
bd_close(p_sys->bluray);
if (p_sys->p_vout != NULL) {
- var_DelCallback(p_sys->p_vout, "mouse-moved", &onMouseEvent, p_demux);
- var_DelCallback(p_sys->p_vout, "mouse-clicked", &onMouseEvent, p_demux);
+ var_DelCallback(p_sys->p_vout, "mouse-moved", onMouseEvent, p_demux);
+ var_DelCallback(p_sys->p_vout, "mouse-clicked", onMouseEvent, p_demux);
vlc_object_release(p_sys->p_vout);
}
if (p_sys->p_input != NULL)
if ( unlikely(p_out == NULL) )
return NULL;
- p_out->pf_add = &esOutAdd;
- p_out->pf_control = &esOutControl;
- p_out->pf_del = &esOutDel;
- p_out->pf_destroy = &esOutDestroy;
- p_out->pf_send = &esOutSend;
+ p_out->pf_add = esOutAdd;
+ p_out->pf_control = esOutControl;
+ p_out->pf_del = esOutDel;
+ p_out->pf_destroy = esOutDestroy;
+ p_out->pf_send = esOutSend;
p_out->p_sys = malloc( sizeof(*p_out->p_sys) );
if ( unlikely( p_out->p_sys == NULL ) ) {
return;
}
- subpicture_region_t **p_dst = &(p_subpic->p_region);
+ subpicture_region_t **p_dst = &p_subpic->p_region;
while (p_src != NULL) {
*p_dst = subpicture_region_Clone(p_src);
if (*p_dst == NULL)
break;
- p_dst = &((*p_dst)->p_next);
+ p_dst = &(*p_dst)->p_next;
p_src = p_src->p_next;
}
if (*p_dst != NULL)
/* Now we can update the region, regardless it's an update or an insert */
const BD_PG_RLE_ELEM *img = ov->img;
- for (int y = 0; y < ov->h; y++) {
+ for (int y = 0; y < ov->h; y++)
for (int x = 0; x < ov->w;) {
memset(p_reg->p_picture->p[0].p_pixels +
y * p_reg->p_picture->p[0].i_pitch + x,
x += img->len;
img++;
}
- }
+
if (ov->palette) {
p_reg->fmt.p_palette->i_entries = 256;
for (int i = 0; i < 256; ++i) {
p_reg->fmt.p_palette->palette[i][3] = ov->palette[i].T;
}
}
+
vlc_mutex_unlock(&p_sys->p_overlays[ov->plane]->lock);
/*
* /!\ The region is now stored in our internal list, but not in the subpicture /!\
blurayCloseAllOverlays(p_demux);
return;
}
+
switch (overlay->cmd) {
- case BD_OVERLAY_INIT:
- msg_Info(p_demux, "Initializing overlay");
- blurayInitOverlay(p_demux, overlay->plane, overlay->w, overlay->h);
- break;
- case BD_OVERLAY_CLEAR:
- blurayClearOverlay(p_demux, overlay->plane);
- break;
- case BD_OVERLAY_FLUSH:
- blurayActivateOverlay(p_demux, overlay->plane);
- break;
- case BD_OVERLAY_DRAW:
- blurayDrawOverlay(p_demux, overlay);
- break;
- default:
- msg_Warn(p_demux, "Unknown BD overlay command: %u", overlay->cmd);
- break;
+ case BD_OVERLAY_INIT:
+ msg_Info(p_demux, "Initializing overlay");
+ blurayInitOverlay(p_demux, overlay->plane, overlay->w, overlay->h);
+ break;
+ case BD_OVERLAY_CLEAR:
+ blurayClearOverlay(p_demux, overlay->plane);
+ break;
+ case BD_OVERLAY_FLUSH:
+ blurayActivateOverlay(p_demux, overlay->plane);
+ break;
+ case BD_OVERLAY_DRAW:
+ blurayDrawOverlay(p_demux, overlay);
+ break;
+ default:
+ msg_Warn(p_demux, "Unknown BD overlay command: %u", overlay->cmd);
+ break;
}
}
demux_t *p_demux = (demux_t*)ptr;
switch (overlay->cmd) {
- case BD_ARGB_OVERLAY_INIT:
- blurayInitArgbOverlay(p_demux, overlay->plane, overlay->w, overlay->h);
- break;
- case BD_ARGB_OVERLAY_CLOSE:
- blurayClearOverlay(p_demux, overlay->plane);
- // TODO: blurayCloseOverlay(p_demux, overlay->plane);
- break;
- case BD_ARGB_OVERLAY_FLUSH:
- blurayActivateOverlay(p_demux, overlay->plane);
- break;
- case BD_ARGB_OVERLAY_DRAW:
- blurayDrawArgbOverlay(p_demux, overlay);
- break;
- default:
- msg_Warn(p_demux, "Unknown BD ARGB overlay command: %u", overlay->cmd);
- break;
+ case BD_ARGB_OVERLAY_INIT:
+ blurayInitArgbOverlay(p_demux, overlay->plane, overlay->w, overlay->h);
+ break;
+ case BD_ARGB_OVERLAY_CLOSE:
+ blurayClearOverlay(p_demux, overlay->plane);
+ // TODO: blurayCloseOverlay(p_demux, overlay->plane);
+ break;
+ case BD_ARGB_OVERLAY_FLUSH:
+ blurayActivateOverlay(p_demux, overlay->plane);
+ break;
+ case BD_ARGB_OVERLAY_DRAW:
+ blurayDrawArgbOverlay(p_demux, overlay);
+ break;
+ default:
+ msg_Warn(p_demux, "Unknown BD ARGB overlay command: %u", overlay->cmd);
+ break;
}
}
demux_sys_t *p_sys = p_demux->p_sys;
if (p_sys->p_parser)
stream_Delete(p_sys->p_parser);
+
p_sys->p_parser = stream_DemuxNew(p_demux, "ts", p_sys->p_out);
- if (!p_sys->p_parser) {
+
+ if (!p_sys->p_parser)
msg_Err(p_demux, "Failed to create TS demuxer");
- }
}
static void blurayUpdateTitle(demux_t *p_demux, unsigned i_title)
msg_Dbg( p_demux, "Selecting Title %i", i_title);
- /* Select Blu-Ray title */
if (bd_select_title(p_demux->p_sys->bluray, i_title) == 0 ) {
msg_Err(p_demux, "cannot select bd title '%d'", p_demux->info.i_title);
return VLC_EGENERIC;
return VLC_SUCCESS;
}
-
/*****************************************************************************
* blurayControl: handle the controls
*****************************************************************************/
int64_t *pi_64;
switch (query) {
- case DEMUX_CAN_SEEK:
- case DEMUX_CAN_PAUSE:
- case DEMUX_CAN_CONTROL_PACE:
- pb_bool = (bool*)va_arg( args, bool * );
- *pb_bool = true;
- break;
-
- case DEMUX_GET_PTS_DELAY:
- pi_64 = (int64_t*)va_arg( args, int64_t * );
- *pi_64 =
- INT64_C(1000) * var_InheritInteger( p_demux, "disc-caching" );
- break;
-
- case DEMUX_SET_PAUSE_STATE:
- /* Nothing to do */
- break;
-
- case DEMUX_SET_TITLE:
- {
- int i_title = (int)va_arg( args, int );
- if (bluraySetTitle(p_demux, i_title) != VLC_SUCCESS)
- return VLC_EGENERIC;
- break;
- }
- case DEMUX_SET_SEEKPOINT:
- {
- int i_chapter = (int)va_arg( args, int );
- bd_seek_chapter( p_sys->bluray, i_chapter );
- p_demux->info.i_update = INPUT_UPDATE_SEEKPOINT;
- break;
- }
+ case DEMUX_CAN_SEEK:
+ case DEMUX_CAN_PAUSE:
+ case DEMUX_CAN_CONTROL_PACE:
+ pb_bool = (bool*)va_arg( args, bool * );
+ *pb_bool = true;
+ break;
+
+ case DEMUX_GET_PTS_DELAY:
+ pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = INT64_C(1000) * var_InheritInteger(p_demux, "disc-caching");
+ break;
+
+ case DEMUX_SET_PAUSE_STATE:
+ /* Nothing to do */
+ break;
+
+ case DEMUX_SET_TITLE:
+ {
+ int i_title = (int)va_arg( args, int );
+ if (bluraySetTitle(p_demux, i_title) != VLC_SUCCESS)
+ return VLC_EGENERIC;
+ break;
+ }
+ case DEMUX_SET_SEEKPOINT:
+ {
+ int i_chapter = (int)va_arg( args, int );
+ bd_seek_chapter( p_sys->bluray, i_chapter );
+ p_demux->info.i_update = INPUT_UPDATE_SEEKPOINT;
+ break;
+ }
- case DEMUX_GET_TITLE_INFO:
- {
- input_title_t ***ppp_title = (input_title_t***)va_arg( args, input_title_t*** );
- int *pi_int = (int*)va_arg( args, int* );
- int *pi_title_offset = (int*)va_arg( args, int* );
- int *pi_chapter_offset = (int*)va_arg( args, int* );
-
- /* */
- *pi_title_offset = 0;
- *pi_chapter_offset = 0;
-
- /* Duplicate local title infos */
- *pi_int = p_sys->i_title;
- *ppp_title = calloc( p_sys->i_title, sizeof(input_title_t **) );
- for( unsigned int i = 0; i < p_sys->i_title; i++ )
- (*ppp_title)[i] = vlc_input_title_Duplicate( p_sys->pp_title[i]);
-
- return VLC_SUCCESS;
- }
+ case DEMUX_GET_TITLE_INFO:
+ {
+ input_title_t ***ppp_title = (input_title_t***)va_arg( args, input_title_t*** );
+ int *pi_int = (int*)va_arg( args, int* );
+ int *pi_title_offset = (int*)va_arg( args, int* );
+ int *pi_chapter_offset = (int*)va_arg( args, int* );
+
+ /* */
+ *pi_title_offset = 0;
+ *pi_chapter_offset = 0;
+
+ /* Duplicate local title infos */
+ *pi_int = p_sys->i_title;
+ *ppp_title = malloc(p_sys->i_title * sizeof(input_title_t **));
+ for (unsigned int i = 0; i < p_sys->i_title; i++)
+ (*ppp_title)[i] = vlc_input_title_Duplicate(p_sys->pp_title[i]);
+
+ return VLC_SUCCESS;
+ }
- case DEMUX_GET_LENGTH:
- {
- int64_t *pi_length = (int64_t*)va_arg(args, int64_t *);
- *pi_length = p_demux->info.i_title < (int)p_sys->i_title ? CUR_LENGTH : 0;
- return VLC_SUCCESS;
- }
- case DEMUX_SET_TIME:
- {
- int64_t i_time = (int64_t)va_arg(args, int64_t);
- bd_seek_time(p_sys->bluray, TO_TICKS(i_time));
- return VLC_SUCCESS;
- }
- case DEMUX_GET_TIME:
- {
- int64_t *pi_time = (int64_t*)va_arg(args, int64_t *);
- *pi_time = (int64_t)FROM_TICKS(bd_tell_time(p_sys->bluray));
- return VLC_SUCCESS;
- }
+ case DEMUX_GET_LENGTH:
+ {
+ int64_t *pi_length = (int64_t*)va_arg(args, int64_t *);
+ *pi_length = p_demux->info.i_title < (int)p_sys->i_title ? CUR_LENGTH : 0;
+ return VLC_SUCCESS;
+ }
+ case DEMUX_SET_TIME:
+ {
+ int64_t i_time = (int64_t)va_arg(args, int64_t);
+ bd_seek_time(p_sys->bluray, TO_TICKS(i_time));
+ return VLC_SUCCESS;
+ }
+ case DEMUX_GET_TIME:
+ {
+ int64_t *pi_time = (int64_t*)va_arg(args, int64_t *);
+ *pi_time = (int64_t)FROM_TICKS(bd_tell_time(p_sys->bluray));
+ return VLC_SUCCESS;
+ }
- case DEMUX_GET_POSITION:
- {
- double *pf_position = (double*)va_arg( args, double * );
- *pf_position = p_demux->info.i_title < (int)p_sys->i_title ?
- (double)FROM_TICKS(bd_tell_time(p_sys->bluray))/CUR_LENGTH : 0.0;
- return VLC_SUCCESS;
- }
- case DEMUX_SET_POSITION:
- {
- double f_position = (double)va_arg(args, double);
- bd_seek_time(p_sys->bluray, TO_TICKS(f_position*CUR_LENGTH));
- return VLC_SUCCESS;
- }
+ case DEMUX_GET_POSITION:
+ {
+ double *pf_position = (double*)va_arg( args, double * );
+ *pf_position = p_demux->info.i_title < (int)p_sys->i_title ?
+ (double)FROM_TICKS(bd_tell_time(p_sys->bluray))/CUR_LENGTH : 0.0;
+ return VLC_SUCCESS;
+ }
+ case DEMUX_SET_POSITION:
+ {
+ double f_position = (double)va_arg(args, double);
+ bd_seek_time(p_sys->bluray, TO_TICKS(f_position*CUR_LENGTH));
+ return VLC_SUCCESS;
+ }
- case DEMUX_GET_META:
- {
- vlc_meta_t *p_meta = (vlc_meta_t *) va_arg (args, vlc_meta_t*);
- const META_DL *meta = p_sys->p_meta;
- if (meta == NULL)
- return VLC_EGENERIC;
+ case DEMUX_GET_META:
+ {
+ vlc_meta_t *p_meta = (vlc_meta_t *) va_arg (args, vlc_meta_t*);
+ const META_DL *meta = p_sys->p_meta;
+ if (meta == NULL)
+ return VLC_EGENERIC;
- if (!EMPTY_STR(meta->di_name)) vlc_meta_SetTitle(p_meta, meta->di_name);
+ if (!EMPTY_STR(meta->di_name)) vlc_meta_SetTitle(p_meta, meta->di_name);
- if (!EMPTY_STR(meta->language_code)) vlc_meta_AddExtra(p_meta, "Language", meta->language_code);
- if (!EMPTY_STR(meta->filename)) vlc_meta_AddExtra(p_meta, "Filename", meta->filename);
- if (!EMPTY_STR(meta->di_alternative)) vlc_meta_AddExtra(p_meta, "Alternative", meta->di_alternative);
+ if (!EMPTY_STR(meta->language_code)) vlc_meta_AddExtra(p_meta, "Language", meta->language_code);
+ if (!EMPTY_STR(meta->filename)) vlc_meta_AddExtra(p_meta, "Filename", meta->filename);
+ if (!EMPTY_STR(meta->di_alternative)) vlc_meta_AddExtra(p_meta, "Alternative", meta->di_alternative);
- // if (meta->di_set_number > 0) vlc_meta_SetTrackNum(p_meta, meta->di_set_number);
- // if (meta->di_num_sets > 0) vlc_meta_AddExtra(p_meta, "Discs numbers in Set", meta->di_num_sets);
+ // if (meta->di_set_number > 0) vlc_meta_SetTrackNum(p_meta, meta->di_set_number);
+ // if (meta->di_num_sets > 0) vlc_meta_AddExtra(p_meta, "Discs numbers in Set", meta->di_num_sets);
- if (meta->thumb_count > 0 && meta->thumbnails)
+ if (meta->thumb_count > 0 && meta->thumbnails)
+ {
+ char *psz_thumbpath;
+ if( asprintf( &psz_thumbpath, "%s" DIR_SEP "BDMV" DIR_SEP "META" DIR_SEP "DL" DIR_SEP "%s",
+ p_sys->psz_bd_path, meta->thumbnails[0].path ) > 0 )
{
- char *psz_thumbpath;
- if( asprintf( &psz_thumbpath, "%s" DIR_SEP "BDMV" DIR_SEP "META" DIR_SEP "DL" DIR_SEP "%s",
- p_sys->psz_bd_path, meta->thumbnails[0].path ) > 0 )
- {
- char *psz_thumburl = vlc_path2uri( psz_thumbpath, "file" );
- if( unlikely(psz_thumburl == NULL) )
- return VLC_ENOMEM;
-
- vlc_meta_SetArtURL( p_meta, psz_thumburl );
- free( psz_thumburl );
- }
- free( psz_thumbpath );
- }
+ char *psz_thumburl = vlc_path2uri( psz_thumbpath, "file" );
+ if( unlikely(psz_thumburl == NULL) )
+ return VLC_ENOMEM;
- return VLC_SUCCESS;
+ vlc_meta_SetArtURL( p_meta, psz_thumburl );
+ free( psz_thumburl );
+ }
+ free( psz_thumbpath );
}
- case DEMUX_NAV_ACTIVATE:
- return sendKeyEvent(p_sys, BD_VK_ENTER);
- case DEMUX_NAV_UP:
- return sendKeyEvent(p_sys, BD_VK_UP);
- case DEMUX_NAV_DOWN:
- return sendKeyEvent(p_sys, BD_VK_DOWN);
- case DEMUX_NAV_LEFT:
- return sendKeyEvent(p_sys, BD_VK_LEFT);
- case DEMUX_NAV_RIGHT:
- return sendKeyEvent(p_sys, BD_VK_RIGHT);
-
- case DEMUX_CAN_RECORD:
- case DEMUX_GET_FPS:
- case DEMUX_SET_GROUP:
- case DEMUX_HAS_UNSUPPORTED_META:
- case DEMUX_GET_ATTACHMENTS:
- return VLC_EGENERIC;
- default:
- msg_Warn( p_demux, "unimplemented query (%d) in control", query );
- return VLC_EGENERIC;
+ return VLC_SUCCESS;
+ }
+
+ case DEMUX_NAV_ACTIVATE:
+ return sendKeyEvent(p_sys, BD_VK_ENTER);
+ case DEMUX_NAV_UP:
+ return sendKeyEvent(p_sys, BD_VK_UP);
+ case DEMUX_NAV_DOWN:
+ return sendKeyEvent(p_sys, BD_VK_DOWN);
+ case DEMUX_NAV_LEFT:
+ return sendKeyEvent(p_sys, BD_VK_LEFT);
+ case DEMUX_NAV_RIGHT:
+ return sendKeyEvent(p_sys, BD_VK_RIGHT);
+
+ case DEMUX_CAN_RECORD:
+ case DEMUX_GET_FPS:
+ case DEMUX_SET_GROUP:
+ case DEMUX_HAS_UNSUPPORTED_META:
+ case DEMUX_GET_ATTACHMENTS:
+ return VLC_EGENERIC;
+ default:
+ msg_Warn( p_demux, "unimplemented query (%d) in control", query );
+ return VLC_EGENERIC;
}
return VLC_SUCCESS;
}
-static void blurayUpdateCurrentClip( demux_t *p_demux, uint32_t clip )
+static void blurayUpdateCurrentClip( demux_t *p_demux, uint32_t clip )
{
if (clip == 0xFF)
return ;
demux_sys_t *p_sys = p_demux->p_sys;
p_sys->i_current_clip = clip;
- BLURAY_TITLE_INFO *info = bd_get_title_info(p_sys->bluray,
+ BLURAY_TITLE_INFO *info = bd_get_title_info(p_sys->bluray,
bd_get_current_title(p_sys->bluray), 0);
if ( info == NULL )
return ;
static void blurayHandleEvent( demux_t *p_demux, const BD_EVENT *e )
{
- demux_sys_t *p_sys = p_demux->p_sys;
+ demux_sys_t *p_sys = p_demux->p_sys;
switch (e->event)
{
- case BD_EVENT_TITLE:
- blurayUpdateTitle(p_demux, e->param);
- break;
- case BD_EVENT_PLAYITEM:
- blurayUpdateCurrentClip(p_demux, e->param);
- break;
- case BD_EVENT_AUDIO_STREAM:
- {
- if ( e->param == 0xFF )
- break ;
- BLURAY_TITLE_INFO *info = bd_get_title_info(p_sys->bluray,
- bd_get_current_title(p_sys->bluray), 0);
- if ( info == NULL )
- break ;
- /* The param we get is the real stream id, not an index, ie. it starts from 1 */
- int pid = info->clips[p_sys->i_current_clip].audio_streams[e->param - 1].pid;
- int idx = findEsPairIndex( p_sys, pid );
- if ( idx >= 0 ) {
- es_out_id_t *p_es = vlc_array_item_at_index(&p_sys->es, idx);
- es_out_Control( p_demux->out, ES_OUT_SET_ES, p_es );
- }
- bd_free_title_info( info );
- p_sys->i_audio_stream = pid;
+ case BD_EVENT_TITLE:
+ blurayUpdateTitle(p_demux, e->param);
+ break;
+ case BD_EVENT_PLAYITEM:
+ blurayUpdateCurrentClip(p_demux, e->param);
+ break;
+ case BD_EVENT_AUDIO_STREAM:
+ if ( e->param == 0xFF )
break ;
+ BLURAY_TITLE_INFO *info = bd_get_title_info(p_sys->bluray,
+ bd_get_current_title(p_sys->bluray), 0);
+ if (info == NULL)
+ break ;
+ /* The param we get is the real stream id, not an index, ie. it starts from 1 */
+ int pid = info->clips[p_sys->i_current_clip].audio_streams[e->param - 1].pid;
+ int idx = findEsPairIndex(p_sys, pid);
+ if (idx >= 0) {
+ es_out_id_t *p_es = vlc_array_item_at_index(&p_sys->es, idx);
+ es_out_Control( p_demux->out, ES_OUT_SET_ES, p_es );
}
- case BD_EVENT_CHAPTER:
- p_demux->info.i_update |= INPUT_UPDATE_SEEKPOINT;
- p_demux->info.i_seekpoint = e->param;
- break;
- case BD_EVENT_ANGLE:
- case BD_EVENT_IG_STREAM:
- default:
- msg_Warn( p_demux, "event: %d param: %d", e->event, e->param );
- break;
+ bd_free_title_info( info );
+ p_sys->i_audio_stream = pid;
+ break ;
+ case BD_EVENT_CHAPTER:
+ p_demux->info.i_update |= INPUT_UPDATE_SEEKPOINT;
+ p_demux->info.i_seekpoint = e->param;
+ break;
+ case BD_EVENT_ANGLE:
+ case BD_EVENT_IG_STREAM:
+ default:
+ msg_Warn(p_demux, "event: %d param: %d", e->event, e->param);
+ break;
}
}
block_Release(p_block);
return 1;
}
+
if (p_sys->current_overlay != -1) {
vlc_mutex_lock(&p_sys->p_overlays[p_sys->current_overlay]->lock);
if (p_sys->p_overlays[p_sys->current_overlay]->status == ToDisplay) {
if (p_sys->p_vout == NULL)
p_sys->p_vout = input_GetVout(p_sys->p_input);
if (p_sys->p_vout != NULL) {
- var_AddCallback(p_sys->p_vout, "mouse-moved", &onMouseEvent, p_demux);
- var_AddCallback(p_sys->p_vout, "mouse-clicked", &onMouseEvent, p_demux);
+ var_AddCallback(p_sys->p_vout, "mouse-moved", onMouseEvent, p_demux);
+ var_AddCallback(p_sys->p_vout, "mouse-clicked", onMouseEvent, p_demux);
bluraySendOverlayToVout(p_demux);
}
} else