static int Control( demux_t *p_demux, int i_query, va_list args ) { demux_sys_t *p_sys = p_demux->p_sys; if( i_query == DEMUX_GET_META ) { vlc_meta_t *p_meta = va_arg( args, vlc_meta_t * ); if( p_demux->p_sys->p_meta ) vlc_meta_Merge( p_meta, p_demux->p_sys->p_meta ); return VLC_SUCCESS; }
static void ApplyResult( fingerprint_request_t *p_r, size_t i_resultid ) { if ( i_resultid >= vlc_array_count( & p_r->results.metas_array ) ) return; vlc_meta_t *p_meta = (vlc_meta_t *) vlc_array_item_at_index( & p_r->results.metas_array, i_resultid ); input_item_t *p_item = p_r->p_item; vlc_mutex_lock( &p_item->lock ); vlc_meta_Merge( p_item->p_meta, p_meta ); vlc_mutex_unlock( &p_item->lock ); }
/***************************************************************************** * Control input stream *****************************************************************************/ static int Control( access_t *p_access, int i_query, va_list args ) { access_sys_t *p_sys = p_access->p_sys; input_title_t ***ppp_title; int i; int64_t *pi64; vlc_meta_t *p_meta; switch( i_query ) { case ACCESS_CAN_SEEK: case ACCESS_CAN_FASTSEEK: case ACCESS_CAN_PAUSE: case ACCESS_CAN_CONTROL_PACE: *va_arg( args, bool* ) = true; break; case ACCESS_GET_SIZE: *va_arg( args, uint64_t* ) = p_sys->size; break; case ACCESS_GET_PTS_DELAY: pi64 = va_arg( args, int64_t * ); *pi64 = INT64_C(1000) * var_InheritInteger( p_access, "file-caching" ); break; case ACCESS_SET_PAUSE_STATE: /* nothing to do */ break; case ACCESS_GET_TITLE_INFO: /* return a copy of our seek points */ if( !p_sys->p_marks ) return VLC_EGENERIC; ppp_title = va_arg( args, input_title_t*** ); *va_arg( args, int* ) = 1; *ppp_title = malloc( sizeof( **ppp_title ) ); if( !*ppp_title ) return VLC_ENOMEM; **ppp_title = vlc_input_title_Duplicate( p_sys->p_marks ); break; case ACCESS_GET_TITLE: *va_arg( args, unsigned * ) = 0; break; case ACCESS_GET_SEEKPOINT: *va_arg( args, unsigned * ) = p_sys->cur_seekpoint; break; case ACCESS_GET_CONTENT_TYPE: *va_arg( args, char ** ) = strdup( p_sys->b_ts_format ? "video/MP2T" : "video/MP2P" ); break; case ACCESS_SET_TITLE: /* ignore - only one title */ break; case ACCESS_SET_SEEKPOINT: i = va_arg( args, int ); return Seek( p_access, p_sys->offsets[i] ); case ACCESS_GET_META: p_meta = va_arg( args, vlc_meta_t* ); vlc_meta_Merge( p_meta, p_sys->p_meta ); break; default: return VLC_EGENERIC; } return VLC_SUCCESS; }
/***************************************************************************** * Control: *****************************************************************************/ static int Control( demux_t *p_demux, int i_query, va_list args ) { demux_sys_t *p_sys = p_demux->p_sys; int64_t *pi64, i64; double *pf, f; int i_skp; size_t i_idx; bool b; vlc_meta_t *p_meta; input_attachment_t ***ppp_attach; int *pi_int; switch( i_query ) { case DEMUX_CAN_SEEK: return vlc_stream_vaControl( p_demux->s, i_query, args ); case DEMUX_GET_ATTACHMENTS: ppp_attach = va_arg( args, input_attachment_t*** ); pi_int = va_arg( args, int * ); if( p_sys->stored_attachments.size() <= 0 ) return VLC_EGENERIC; *pi_int = p_sys->stored_attachments.size(); *ppp_attach = static_cast<input_attachment_t**>( malloc( sizeof(input_attachment_t*) * p_sys->stored_attachments.size() ) ); if( !(*ppp_attach) ) return VLC_ENOMEM; for( size_t i = 0; i < p_sys->stored_attachments.size(); i++ ) { attachment_c *a = p_sys->stored_attachments[i]; (*ppp_attach)[i] = vlc_input_attachment_New( a->fileName(), a->mimeType(), NULL, a->p_data, a->size() ); if( !(*ppp_attach)[i] ) { free(*ppp_attach); return VLC_ENOMEM; } } return VLC_SUCCESS; case DEMUX_GET_META: p_meta = va_arg( args, vlc_meta_t* ); vlc_meta_Merge( p_meta, p_sys->meta ); return VLC_SUCCESS; case DEMUX_GET_LENGTH: pi64 = va_arg( args, int64_t * ); if( p_sys->f_duration > 0.0 ) { *pi64 = static_cast<int64_t>( p_sys->f_duration * 1000 ); return VLC_SUCCESS; } return VLC_EGENERIC; case DEMUX_GET_POSITION: pf = va_arg( args, double * ); if ( p_sys->f_duration > 0.0 ) *pf = static_cast<double> (p_sys->i_pcr >= p_sys->i_start_pts ? p_sys->i_pcr : p_sys->i_start_pts ) / (1000.0 * p_sys->f_duration); return VLC_SUCCESS; case DEMUX_SET_POSITION: if( p_sys->f_duration > 0.0 ) { f = va_arg( args, double ); b = va_arg( args, int ); /* precise? */ Seek( p_demux, -1, f, NULL, b ); return VLC_SUCCESS; } return VLC_EGENERIC; case DEMUX_GET_TIME: pi64 = va_arg( args, int64_t * ); *pi64 = p_sys->i_pcr; return VLC_SUCCESS; case DEMUX_GET_TITLE_INFO: if( p_sys->titles.size() > 1 || ( p_sys->titles.size() == 1 && p_sys->titles[0]->i_seekpoint > 0 ) ) { input_title_t ***ppp_title = va_arg( args, input_title_t*** ); int *pi_int = va_arg( args, int* ); *pi_int = p_sys->titles.size(); *ppp_title = static_cast<input_title_t**>( malloc( sizeof( input_title_t* ) * p_sys->titles.size() ) ); for( size_t i = 0; i < p_sys->titles.size(); i++ ) (*ppp_title)[i] = vlc_input_title_Duplicate( p_sys->titles[i] ); return VLC_SUCCESS; }
/***************************************************************************** * Control input stream *****************************************************************************/ static int Control( access_t *p_access, int i_query, va_list args ) { access_sys_t *p_sys = p_access->p_sys; input_title_t ***ppp_title; int i; int64_t *pi64; vlc_meta_t *p_meta; switch( i_query ) { case ACCESS_CAN_SEEK: case ACCESS_CAN_FASTSEEK: case ACCESS_CAN_PAUSE: case ACCESS_CAN_CONTROL_PACE: *va_arg( args, bool* ) = true; break; case ACCESS_GET_PTS_DELAY: pi64 = va_arg( args, int64_t * ); *pi64 = INT64_C(1000) * var_InheritInteger( p_access, "file-caching" ); break; case ACCESS_SET_PAUSE_STATE: /* nothing to do */ break; case ACCESS_GET_TITLE_INFO: /* return a copy of our seek points */ if( !p_sys->p_marks ) return VLC_EGENERIC; ppp_title = va_arg( args, input_title_t*** ); *va_arg( args, int* ) = 1; *ppp_title = malloc( sizeof( input_title_t** ) ); if( !*ppp_title ) return VLC_ENOMEM; **ppp_title = vlc_input_title_Duplicate( p_sys->p_marks ); break; case ACCESS_SET_TITLE: /* ignore - only one title */ break; case ACCESS_SET_SEEKPOINT: i = va_arg( args, int ); /* Seek updates p_access->info */ return Seek( p_access, p_sys->p_marks->seekpoint[i]->i_byte_offset ); case ACCESS_GET_META: if( !p_sys->p_meta ) return VLC_EGENERIC; p_meta = va_arg( args, vlc_meta_t* ); vlc_meta_Merge( p_meta, p_sys->p_meta ); break; case ACCESS_SET_PRIVATE_ID_STATE: case ACCESS_GET_CONTENT_TYPE: return VLC_EGENERIC; default: msg_Warn( p_access, "unimplemented query in control" ); return VLC_EGENERIC; } return VLC_SUCCESS; }