@ -113,6 +113,20 @@ static int live_flv_probe(const AVProbeData *p)
return probe ( p , 1 ) ;
}
static int kux_probe ( const AVProbeData * p )
{
const uint8_t * d = p - > buf ;
if ( d [ 0 ] = = ' K ' & &
d [ 1 ] = = ' D ' & &
d [ 2 ] = = ' K ' & &
d [ 3 ] = = 0 & &
d [ 4 ] = = 0 ) {
return AVPROBE_SCORE_EXTENSION + 1 ;
}
return 0 ;
}
static void add_keyframes_index ( AVFormatContext * s )
{
FLVContext * flv = s - > priv_data ;
@ -738,6 +752,10 @@ static int flv_read_header(AVFormatContext *s)
int offset ;
int pre_tag_size = 0 ;
/* Actual FLV data at 0xe40000 in KUX file */
if ( ! strcmp ( s - > iformat - > name , " kux " ) )
avio_skip ( s - > pb , 0xe40000 ) ;
avio_skip ( s - > pb , 4 ) ;
flags = avio_r8 ( s - > pb ) ;
@ -1386,3 +1404,23 @@ AVInputFormat ff_live_flv_demuxer = {
. priv_class = & live_flv_class ,
. flags = AVFMT_TS_DISCONT
} ;
static const AVClass kux_class = {
. class_name = " kuxdec " ,
. item_name = av_default_item_name ,
. option = options ,
. version = LIBAVUTIL_VERSION_INT ,
} ;
AVInputFormat ff_kux_demuxer = {
. name = " kux " ,
. long_name = NULL_IF_CONFIG_SMALL ( " KUX (YouKu) " ) ,
. priv_data_size = sizeof ( FLVContext ) ,
. read_probe = kux_probe ,
. read_header = flv_read_header ,
. read_packet = flv_read_packet ,
. read_seek = flv_read_seek ,
. read_close = flv_read_close ,
. extensions = " kux " ,
. priv_class = & kux_class ,
} ;