Commit 4f050947 authored by JP Dinger's avatar JP Dinger

Refactor vcdx info.c dropping a few memory leaks and other problems. It...

Refactor vcdx info.c dropping a few memory leaks and other problems. It compiles, but I can't test it.
parent fd1c320b
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License along
* along with this program; if not, write to the Free Software * with this program; if not, write to the Free Software Foundation, Inc.,
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/ *****************************************************************************/
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <vlc_input.h> #include <vlc_input.h>
#include <vlc_access.h> #include <vlc_access.h>
#include "vcd.h" #include "vcd.h"
#include <vlc_keys.h>
#include "info.h" #include "info.h"
#include <cdio/cdio.h> #include <cdio/cdio.h>
...@@ -39,93 +38,60 @@ ...@@ -39,93 +38,60 @@
#include <libvcd/info.h> #include <libvcd/info.h>
#include <libvcd/logging.h> #include <libvcd/logging.h>
static inline void static char *
MetaInfoAddStr( access_t *p_access, char *psz_cat, VCDFormatStr(vcdplayer_t *p_vcdplayer,
const char *title, const char *psz ) const char *format_str, const char *mrl,
{ const vcdinfo_itemid_t *itemid);
vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys;
if ( psz ) {
dbg_print( INPUT_DBG_META, "cat %s, field: %s: %s", psz_cat, title, psz);
input_Control( p_vcdplayer->p_input, INPUT_ADD_INFO, psz_cat, title, "%s",
psz);
}
}
static inline void
MetaInfoAddNum(access_t *p_access, char *psz_cat, const char *title, int num)
{
vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys;
dbg_print( INPUT_DBG_META, "cat %s, field %s: %d", psz_cat, title, num);
input_Control( p_vcdplayer->p_input, INPUT_ADD_INFO, psz_cat, title,
"%d", num );
}
static inline void
MetaInfoAddHex(access_t *p_access, char *psz_cat, const char *title, int hex)
{
vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys;
dbg_print( INPUT_DBG_META, "cat %s, field %s: %d", psz_cat, title, hex);
input_Control( p_vcdplayer->p_input, INPUT_ADD_INFO, psz_cat, title,
"%x", hex );
}
#define addstr(title, str) \
MetaInfoAddStr( p_access, psz_cat, title, str );
#define addnum(title, num) \
MetaInfoAddNum( p_access, psz_cat, title, num );
#define addhex(title, hex) \
MetaInfoAddHex( p_access, psz_cat, title, hex );
void void
VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl )
{ {
vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys; vcdplayer_t *p_vcdplayer = (vcdplayer_t *) p_access->p_sys;
unsigned int i_entries = vcdinfo_get_num_entries(p_vcdplayer->vcd); input_thread_t *p_input = p_vcdplayer->p_input;
unsigned int last_entry = 0; vcdinfo_obj_t *p_vcdev = p_vcdplayer->vcd;
char *psz_cat;
size_t i_entries = vcdinfo_get_num_entries(p_vcdev);
size_t last_entry = 0;
char *psz_cat = _("Disc");
track_t i_track; track_t i_track;
psz_cat = _("Disc"); # define addstr(t,v) input_Control(p_input,INPUT_ADD_INFO,psz_cat,t,"%s",v)
# define addnum(t,v) input_Control(p_input,INPUT_ADD_INFO,psz_cat,t,"%d",v)
addstr( _("VCD Format"), vcdinfo_get_format_version_str(p_vcdplayer->vcd) ); # define addhex(t,v) input_Control(p_input,INPUT_ADD_INFO,psz_cat,t,"%x",v)
addstr( _("Album"), vcdinfo_get_album_id(p_vcdplayer->vcd));
addstr( _("Application"), vcdinfo_get_application_id(p_vcdplayer->vcd) ); addstr(_("VCD Format"), vcdinfo_get_format_version_str(p_vcdev));
addstr( _("Preparer"), vcdinfo_get_preparer_id(p_vcdplayer->vcd) ); addstr(_("Album"), vcdinfo_get_album_id (p_vcdev));
addnum( _("Vol #"), vcdinfo_get_volume_num(p_vcdplayer->vcd) ); addstr(_("Application"), vcdinfo_get_application_id (p_vcdev));
addnum( _("Vol max #"), vcdinfo_get_volume_count(p_vcdplayer->vcd) ); addstr(_("Preparer"), vcdinfo_get_preparer_id (p_vcdev));
addstr( _("Volume Set"), vcdinfo_get_volumeset_id(p_vcdplayer->vcd) ); addnum(_("Vol #"), vcdinfo_get_volume_num (p_vcdev));
addstr( _("Volume"), vcdinfo_get_volume_id(p_vcdplayer->vcd) ); addnum(_("Vol max #"), vcdinfo_get_volume_count (p_vcdev));
addstr( _("Publisher"), vcdinfo_get_publisher_id(p_vcdplayer->vcd) ); addstr(_("Volume Set"), vcdinfo_get_volumeset_id (p_vcdev));
addstr( _("System Id"), vcdinfo_get_system_id(p_vcdplayer->vcd) ); addstr(_("Volume"), vcdinfo_get_volume_id (p_vcdev));
addnum( "LIDs", vcdinfo_get_num_LIDs(p_vcdplayer->vcd) ); addstr(_("Publisher"), vcdinfo_get_publisher_id (p_vcdev));
addnum( _("Entries"), vcdinfo_get_num_entries(p_vcdplayer->vcd) ); addstr(_("System Id"), vcdinfo_get_system_id (p_vcdev));
addnum( _("Segments"), vcdinfo_get_num_segments(p_vcdplayer->vcd) ); addnum("LIDs", vcdinfo_get_num_LIDs (p_vcdev));
addnum( _("Tracks"), vcdinfo_get_num_tracks(p_vcdplayer->vcd) ); addnum(_("Entries"), vcdinfo_get_num_entries (p_vcdev));
addnum(_("Segments"), vcdinfo_get_num_segments (p_vcdev));
addnum(_("Tracks"), vcdinfo_get_num_tracks (p_vcdev));
/* Spit out track information. Could also include MSF info. /* Spit out track information. Could also include MSF info.
Also build title table. Also build title table.
*/ */
#define TITLE_MAX 30
for( i_track = 1 ; i_track < p_vcdplayer->i_tracks ; i_track++ ) { for( i_track = 1 ; i_track < p_vcdplayer->i_tracks ; i_track++ ) {
char psz_cat[20]; unsigned int audio_type = vcdinfo_get_track_audio_type(p_vcdev, i_track);
unsigned int audio_type = vcdinfo_get_track_audio_type(p_vcdplayer->vcd, uint32_t i_secsize = vcdinfo_get_track_sect_count(p_vcdev, i_track);
i_track);
uint32_t i_secsize = vcdinfo_get_track_sect_count(p_vcdplayer->vcd, i_track);
snprintf(psz_cat, sizeof(psz_cat), "Track %d", i_track);
if (p_vcdplayer->b_svd) { if (p_vcdplayer->b_svd) {
addnum(_("Audio Channels"), addnum(_("Audio Channels"),
vcdinfo_audio_type_num_channels(p_vcdplayer->vcd, audio_type) ); vcdinfo_audio_type_num_channels(p_vcdev, audio_type) );
} }
addnum(_("First Entry Point"), last_entry ); addnum(_("First Entry Point"), 0 );
for ( ; last_entry < i_entries
&& vcdinfo_get_track(p_vcdplayer->vcd, last_entry) == i_track; for ( last_entry = 0 ; last_entry < i_entries
last_entry++ ) ; && vcdinfo_get_track(p_vcdev, last_entry) == i_track; last_entry++ ) ;
addnum(_("Last Entry Point"), last_entry-1 ); addnum(_("Last Entry Point"), last_entry-1 );
addnum(_("Track size (in sectors)"), i_secsize ); addnum(_("Track size (in sectors)"), i_secsize );
} }
...@@ -134,9 +100,7 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) ...@@ -134,9 +100,7 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl )
lid_t i_lid; lid_t i_lid;
for( i_lid = 1 ; i_lid <= p_vcdplayer->i_lids ; i_lid++ ) { for( i_lid = 1 ; i_lid <= p_vcdplayer->i_lids ; i_lid++ ) {
PsdListDescriptor_t pxd; PsdListDescriptor_t pxd;
char psz_cat[20]; if (vcdinfo_lid_get_pxd(p_vcdev, &pxd, i_lid)) {
snprintf(psz_cat, sizeof(psz_cat), "LID %d", i_lid);
if (vcdinfo_lid_get_pxd(p_vcdplayer->vcd, &pxd, i_lid)) {
switch (pxd.descriptor_type) { switch (pxd.descriptor_type) {
case PSD_TYPE_END_LIST: case PSD_TYPE_END_LIST:
addstr(_("type"), _("end")); addstr(_("type"), _("end"));
...@@ -151,11 +115,8 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) ...@@ -151,11 +115,8 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl )
break; break;
case PSD_TYPE_SELECTION_LIST: case PSD_TYPE_SELECTION_LIST:
case PSD_TYPE_EXT_SELECTION_LIST: case PSD_TYPE_EXT_SELECTION_LIST:
addstr(_("type"), addstr(_("type"), PSD_TYPE_SELECTION_LIST == pxd.descriptor_type
PSD_TYPE_SELECTION_LIST == pxd.descriptor_type ? _("extended selection list") : _("selection list") );
? _("extended selection list")
: _("selection list")
);
addhex("default", vcdinf_psd_get_default_offset(pxd.psd)); addhex("default", vcdinf_psd_get_default_offset(pxd.psd));
addhex("loop count", vcdinf_get_loop_count(pxd.psd)); addhex("loop count", vcdinf_get_loop_count(pxd.psd));
addhex("next", vcdinf_psd_get_next_offset(pxd.psd)); addhex("next", vcdinf_psd_get_next_offset(pxd.psd));
...@@ -172,48 +133,23 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) ...@@ -172,48 +133,23 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl )
} }
} }
} }
# undef addstr
# undef addnum
# undef addhex
if ( CDIO_INVALID_TRACK != i_track ) if ( CDIO_INVALID_TRACK != i_track )
{ {
char* psz_title_format = config_GetPsz( p_access, MODULE_STRING "-title-format" ); char *psz_tfmt = config_GetPsz( p_access, MODULE_STRING "-title-format" );
char *psz_name = char *psz_name = VCDFormatStr( p_vcdplayer, psz_tfmt, psz_mrl,
VCDFormatStr( p_access, p_vcdplayer, psz_title_format, psz_mrl, &(p_vcdplayer->play_item) );
&(p_vcdplayer->play_item) ); free( psz_tfmt );
free( psz_title_format );
input_Control( p_vcdplayer->p_input, INPUT_SET_NAME, psz_name ); input_Control( p_input, INPUT_SET_NAME, psz_name );
free( psz_name );
} }
} }
#define add_format_str_info(val) \
{ \
const char *str = strdup(val); \
unsigned int len; \
if (val != NULL) { \
len=strlen(str); \
if (len != 0) { \
strncat(tp, str, TEMP_STR_LEN-(tp-temp_str)); \
tp += len; \
} \
saw_control_prefix = false; \
} \
}
#define add_format_num_info( val, fmt ) \
{ \
char num_str[10]; \
unsigned int len; \
sprintf(num_str, fmt, val); \
len = strlen(num_str); \
if( len != 0 ) \
{ \
strncat(tp, num_str, TEMP_STR_LEN-(tp-temp_str)); \
tp += len; \
} \
saw_control_prefix = false; \
}
/*! /*!
Take a format string and expand escape sequences, that is sequences that Take a format string and expand escape sequences, that is sequences that
begin with %, with information from the current VCD. begin with %, with information from the current VCD.
...@@ -236,30 +172,28 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ) ...@@ -236,30 +172,28 @@ VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl )
A number between 1 and the volume count. A number between 1 and the volume count.
%% : a % %% : a %
*/ */
char * static char *
VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer, VCDFormatStr(vcdplayer_t *p_vcdplayer,
const char format_str[], const char *mrl, const char *format_str, const char *mrl,
const vcdinfo_itemid_t *itemid) const vcdinfo_itemid_t *itemid)
{ {
#define TEMP_STR_SIZE 256 #define TEMP_STR_SIZE 256
#define TEMP_STR_LEN (TEMP_STR_SIZE-1) char temp_str[TEMP_STR_SIZE];
char temp_str[TEMP_STR_SIZE]; char *tp = temp_str;
size_t i; const char *te = tp+TEMP_STR_SIZE-1;
char * tp = temp_str; bool saw_control_prefix = false;
bool saw_control_prefix = false;
size_t format_len = strlen(format_str);
memset(temp_str, 0, TEMP_STR_SIZE); memset(temp_str, 0, TEMP_STR_SIZE);
for (i=0; i<format_len; i++) { for (; *format_str && tp<te; ++format_str) {
if (!saw_control_prefix && format_str[i] != '%') { if (!saw_control_prefix && *format_str != '%') {
*tp++ = format_str[i]; *tp++ = *format_str;
saw_control_prefix = false; saw_control_prefix = false;
continue; continue;
} }
switch(format_str[i]) { switch(*format_str) {
case '%': case '%':
if (saw_control_prefix) { if (saw_control_prefix) {
*tp++ = '%'; *tp++ = '%';
...@@ -267,44 +201,41 @@ VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer, ...@@ -267,44 +201,41 @@ VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer,
saw_control_prefix = !saw_control_prefix; saw_control_prefix = !saw_control_prefix;
break; break;
case 'A': case 'A':
add_format_str_info(vcdinfo_strip_trail(vcdinfo_get_album_id(p_vcdplayer->vcd), tp += snprintf(tp,te-tp,"%s",
MAX_ALBUM_LEN)); vcdinfo_strip_trail(vcdinfo_get_album_id(p_vcdplayer->vcd),
MAX_ALBUM_LEN));
break; break;
case 'c': case 'c':
add_format_num_info(vcdinfo_get_volume_num(p_vcdplayer->vcd), "%d"); tp += snprintf(tp,te-tp,"%d",vcdinfo_get_volume_num(p_vcdplayer->vcd));
break; break;
case 'C': case 'C':
add_format_num_info(vcdinfo_get_volume_count(p_vcdplayer->vcd), "%d"); tp += snprintf(tp,te-tp,"%d",vcdinfo_get_volume_count(p_vcdplayer->vcd));
break; break;
case 'F': case 'F':
add_format_str_info(vcdinfo_get_format_version_str(p_vcdplayer->vcd)); tp += snprintf(tp,te-tp,"%s",
vcdinfo_get_format_version_str(p_vcdplayer->vcd));
break; break;
case 'I': case 'I':
{ {
switch (itemid->type) { switch (itemid->type) {
case VCDINFO_ITEM_TYPE_TRACK: case VCDINFO_ITEM_TYPE_TRACK:
strncat(tp, _("Track"), TEMP_STR_LEN-(tp-temp_str)); tp += snprintf(tp,te-tp,"%s",_("Track"));
tp += strlen(_("Track"));
break; break;
case VCDINFO_ITEM_TYPE_ENTRY: case VCDINFO_ITEM_TYPE_ENTRY:
strncat(tp, _("Entry"), TEMP_STR_LEN-(tp-temp_str)); tp += snprintf(tp,te-tp,"%s",_("Entry"));
tp += strlen(_("Entry"));
break; break;
case VCDINFO_ITEM_TYPE_SEGMENT: case VCDINFO_ITEM_TYPE_SEGMENT:
strncat(tp, _("Segment"), TEMP_STR_LEN-(tp-temp_str)); tp += snprintf(tp,te-tp,"%s",_("Segment"));
tp += strlen(_("Segment"));
break; break;
case VCDINFO_ITEM_TYPE_LID: case VCDINFO_ITEM_TYPE_LID:
strncat(tp, _("List ID"), TEMP_STR_LEN-(tp-temp_str)); tp += snprintf(tp,te-tp,"%s",_("List ID"));
tp += strlen(_("List ID"));
break; break;
case VCDINFO_ITEM_TYPE_SPAREID2: case VCDINFO_ITEM_TYPE_SPAREID2:
strncat(tp, _("Navigation"), TEMP_STR_LEN-(tp-temp_str)); tp += snprintf(tp,te-tp,"%s",_("Navigation"));
tp += strlen(_("Navigation"));
break; break;
default: default:
/* What to do? */ /* What to do? */
...@@ -315,58 +246,51 @@ VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer, ...@@ -315,58 +246,51 @@ VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer,
break; break;
case 'L': case 'L':
if (vcdplayer_pbc_is_on(p_vcdplayer)) { if (vcdplayer_pbc_is_on(p_vcdplayer))
char num_str[40]; tp += snprintf(tp,te-tp,"%s %d",_("List ID"),p_vcdplayer->i_lid);
sprintf(num_str, "%s %d", _("List ID"), p_vcdplayer->i_lid);
strncat(tp, num_str, TEMP_STR_LEN-(tp-temp_str));
tp += strlen(num_str);
}
saw_control_prefix = false; saw_control_prefix = false;
break; break;
case 'M': case 'M':
add_format_str_info(mrl); tp += snprintf(tp,te-tp,"%s",mrl);
break; break;
case 'N': case 'N':
add_format_num_info(itemid->num, "%d"); tp += snprintf(tp,te-tp,"%d",itemid->num);
break; break;
case 'p': case 'p':
add_format_str_info(vcdinfo_get_preparer_id(p_vcdplayer->vcd)); tp += snprintf(tp,te-tp,"%s",vcdinfo_get_preparer_id(p_vcdplayer->vcd));
break; break;
case 'P': case 'P':
add_format_str_info(vcdinfo_get_publisher_id(p_vcdplayer->vcd)); tp += snprintf(tp,te-tp,"%s",vcdinfo_get_publisher_id(p_vcdplayer->vcd));
break; break;
case 'S': case 'S':
if ( VCDINFO_ITEM_TYPE_SEGMENT==itemid->type ) { if ( VCDINFO_ITEM_TYPE_SEGMENT==itemid->type ) {
char seg_type_str[30]; tp += snprintf(tp,te-tp," %s",
sprintf(seg_type_str, " %s",
vcdinfo_video_type2str(p_vcdplayer->vcd, itemid->num)); vcdinfo_video_type2str(p_vcdplayer->vcd, itemid->num));
strncat(tp, seg_type_str, TEMP_STR_LEN-(tp-temp_str));
tp += strlen(seg_type_str);
} }
saw_control_prefix = false; saw_control_prefix = false;
break; break;
case 'T': case 'T':
add_format_num_info(p_vcdplayer->i_track, "%d"); tp += snprintf(tp,te-tp,"%d",p_vcdplayer->i_track);
break; break;
case 'V': case 'V':
add_format_str_info(vcdinfo_get_volumeset_id(p_vcdplayer->vcd)); tp += snprintf(tp,te-tp,"%s",vcdinfo_get_volumeset_id(p_vcdplayer->vcd));
break; break;
case 'v': case 'v':
add_format_str_info(vcdinfo_get_volume_id(p_vcdplayer->vcd)); tp += snprintf(tp,te-tp,"%s",vcdinfo_get_volume_id(p_vcdplayer->vcd));
break; break;
default: default:
*tp++ = '%'; *tp++ = '%';
*tp++ = format_str[i]; if(tp<te)
*tp++ = *format_str;
saw_control_prefix = false; saw_control_prefix = false;
} }
} }
...@@ -376,24 +300,24 @@ VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer, ...@@ -376,24 +300,24 @@ VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer,
void void
VCDUpdateTitle( access_t *p_access ) VCDUpdateTitle( access_t *p_access )
{ {
vcdplayer_t *p_vcdplayer= (vcdplayer_t *)p_access->p_sys; vcdplayer_t *p_vcdplayer= (vcdplayer_t *)p_access->p_sys;
unsigned int psz_mrl_max = strlen(VCD_MRL_PREFIX) size_t psz_mrl_max = strlen(VCD_MRL_PREFIX)
+ strlen(p_vcdplayer->psz_source) + sizeof("@E999")+3; + strlen(p_vcdplayer->psz_source) + sizeof("@E999")+3;
char *psz_mrl = malloc( psz_mrl_max ); char *psz_mrl = malloc( psz_mrl_max );
if( psz_mrl ) if( psz_mrl )
{ {
char *psz_name; char *psz_name;
char* psz_title_format = config_GetPsz( p_access, MODULE_STRING "-title-format" ); char *psz_tfmt = config_GetPsz( p_access, MODULE_STRING "-title-format" );
snprintf( psz_mrl, psz_mrl_max, "%s%s", snprintf( psz_mrl, psz_mrl_max, "%s%s",
VCD_MRL_PREFIX, p_vcdplayer->psz_source ); VCD_MRL_PREFIX, p_vcdplayer->psz_source );
psz_name = VCDFormatStr( p_access, p_vcdplayer, psz_title_format, psz_mrl, free(psz_tfmt);
psz_name = VCDFormatStr( p_vcdplayer, psz_tfmt, psz_mrl,
&(p_vcdplayer->play_item) ); &(p_vcdplayer->play_item) );
input_Control( p_vcdplayer->p_input, INPUT_SET_NAME, psz_name );
free( psz_title_format );
free(psz_mrl); free(psz_mrl);
input_Control( p_vcdplayer->p_input, INPUT_SET_NAME, psz_name );
free(psz_name);
} }
} }
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License along
* along with this program; if not, write to the Free Software * with this program; if not, write to the Free Software Foundation, Inc.,
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/ *****************************************************************************/
#ifndef VCD_INFO_H #ifndef VCD_INFO_H
...@@ -32,9 +32,12 @@ ...@@ -32,9 +32,12 @@
void VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl ); void VCDMetaInfo( access_t *p_access, /*const*/ char *psz_mrl );
char * VCDFormatStr(const access_t *p_access, vcdplayer_t *p_vcdplayer, #if 0
const char format_str[], const char *mrl, char * VCDFormatStr(vcdplayer_t *p_vcdplayer,
const char *format_str, const char *mrl,
const vcdinfo_itemid_t *itemid); const vcdinfo_itemid_t *itemid);
#endif
void VCDUpdateTitle( access_t *p_access ); void VCDUpdateTitle( access_t *p_access );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment