Commit 203fc8a6 authored by Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf

Remove CMML module.

No maintainer showed up. It is broken in many ways and there is virtually no streams using that...
parent 7c8b9f86
...@@ -103,6 +103,7 @@ Removed modules: ...@@ -103,6 +103,7 @@ Removed modules:
* opie, qte and qte_main * opie, qte and qte_main
* opengllayer * opengllayer
* cddax. Use cdda instead * cddax. Use cdda instead
* cmml.
Changes between 1.0.2 and 1.0.3: Changes between 1.0.2 and 1.0.3:
......
...@@ -3500,16 +3500,6 @@ AS_IF( [test "${enable_asademux}" = "yes"], [ ...@@ -3500,16 +3500,6 @@ AS_IF( [test "${enable_asademux}" = "yes"], [
]) ])
]) ])
dnl
dnl CMML plugin
dnl
AC_ARG_ENABLE(cmml,
[ --enable-cmml CMML support (default enabled)])
if test "${enable_cmml}" != "no"
then
VLC_ADD_PLUGIN([cmml])
fi
dnl dnl
dnl kate decoder plugin dnl kate decoder plugin
dnl dnl
...@@ -5132,7 +5122,6 @@ AC_CONFIG_FILES([ ...@@ -5132,7 +5122,6 @@ AC_CONFIG_FILES([
modules/audio_output/Makefile modules/audio_output/Makefile
modules/codec/Makefile modules/codec/Makefile
modules/codec/avcodec/Makefile modules/codec/avcodec/Makefile
modules/codec/cmml/Makefile
modules/codec/dmo/Makefile modules/codec/dmo/Makefile
modules/codec/shine/Makefile modules/codec/shine/Makefile
modules/codec/subtitles/Makefile modules/codec/subtitles/Makefile
......
...@@ -74,7 +74,6 @@ $Id$ ...@@ -74,7 +74,6 @@ $Id$
* chorus_flanger: variable delay audio filter * chorus_flanger: variable delay audio filter
* chroma_neon: ARM NEONv1 chroma conversion module * chroma_neon: ARM NEONv1 chroma conversion module
* clone: Clone video filter * clone: Clone video filter
* cmml: Continuous Media Markup Language annotations/hyperlinks decoder
* colorthres: Theshold color based on similarity to reference color Video filter * colorthres: Theshold color based on similarity to reference color Video filter
* converter_fixed: Fixed-point audio format conversions * converter_fixed: Fixed-point audio format conversions
* converter_float: Floating-point audio format conversions * converter_float: Floating-point audio format conversions
......
SUBDIRS = cmml dmo avcodec shine subtitles spudec wmafixed SUBDIRS = dmo avcodec shine subtitles spudec wmafixed
SOURCES_a52 = a52.c a52.h SOURCES_a52 = a52.c a52.h
SOURCES_dts = dts.c SOURCES_dts = dts.c
SOURCES_flac = flac.c SOURCES_flac = flac.c
......
What's CMML?
------------
This is an implementation of the Continuous Media Markup Language
(CMML) for VideoLAN. In short, CMML is a (XML) markup language for
time-continuous data, which of course includes multimedia such as
video and audio. It allows one to annotate a media file with both
structured and unstructured textual data, but one of its distinguishing
features--and what this code implements--is its support for embedding
hyperlinks in media files.
So, while viewing some media (e.g. a radio interview with a band),
you could provide a hyperlink to any URL, including a standard web
page or other media (e.g. the band's home page). The hyperlinks
are active only for specific intervals of time while the media is
playing, so for example during a radio interview, the hyperlinks
can change depending on what questions the interviewer is asking
and topic is being discussed.
For more general information on CMML and its role in the bigger
picture of extending the World Wide Web to properly support multimedia,
see <http://www.annodex.net/overview.html>. For specifications of
CMML, see <http://www.annodex.net/specifications.html>.
Usage
-----
Once you have hyperlinking capability, you take on some of the
capabilities of a web browser, in particular following hyperlinks,
and also maintaining a browsing history where you can go backwards
and forwards between pieces of media you've linked to. So, if you
are viewing a file with CMML markup:
* Hyperlinks are displayed as a subtitle track
* Hyperlinks are followed with the VLC "activate" hotkey (by default,
this is just the Enter key)
* Going back and forward are done with the "history-back" and
"history-forward" keys, by default Cmd-[ and Cmd-] on Mac OS X,
and Ctrl-[ and Ctrl-] on all other platforms.
Until the media browsing history features are made available outside
of the CMML plugin, you can only use the history features while
viewing a file that contains CMML markup: e.g. you cannot navigate
backwards or forward in the history while viewing a standard MPEG
video. This is a limitation which may be removed if the media
browsing code is merged into the VLC core.
Overview of the code
--------------------
First: a lot of this code could be implemented, or should be
implemented, in VLC's core (libvlc) rather than be part of a codec
plugin, either because it's something which really should belong
in the core (e.g. media browsing history, system-indepedent interface
to web browser) or a generally useful thing outside of the codec
plugin (e.g. XML parser, URL handling library). That's well and
good, but changes to libvlc are far-reaching and affect all of VLC,
rather than only affecting a single plugin. It's sensible to
gradually merge this stuff into libvlc on an as-needs basis, rather
than trying to refactor out huge amounts of code at once.
Here's a quick overview of what the files do:
* browser_open.[ch]: A very simple attempt to provide a way to
open the system's web browser.
* history.[ch]: Media browsing history (as described above in
"Usage").
* xstrcat.h: Simple wrapper around strcat(1) which performs a
realloc(1) if needed.
* xarray.[ch]: extensible (growable) array, similar to a Vector in
Java/C++. Could be replaced with a vlc_list_t from libvlc's
src/misc/objects.c if the vlc_list_t API were made public.
* xlist.[ch]: Yet Another Linked List implementation (sorry guys
:), only here because XTag (see below) uses it internally.
* xtag.[ch]: A very simple (but working!), lightweight XML
parser.
* xurl.[ch]: A small URL handling library.
* cmml.c: The actual 'codec' parser, which parses the CMML data
(demuxed from the incoming media stream, of course), and provides
two VLC vars ("psz-current-anchor-description" and
"psz-current-anchor-url") which enable intf plugins to display
the CMML data to the user and let them interact with it.
* intf.c: Enables media browsing functionality by displaying
hyperlinks as a subtitle track, and responding to user
keypresses for following hyperlinks and navigating the media
browsing history.
So, all the files except for cmml.c and intf.c could be made available
and re-used outside of this plugin, but currently are not (for the
reasons given above).
SOURCES_cmml = \
browser_open.c browser_open.h \
cmml.c \
history.c history.h \
intf.c \
xarray.c xarray.h \
xlist.c xlist.h \
xstrcat.h \
xtag.c xtag.h \
xurl.c xurl.h
/*****************************************************************************
* browser_open.c: platform-independent opening of a web browser
*****************************************************************************
* Copyright (C) 2004 Commonwealth Scientific and Industrial Research
* Organisation (CSIRO) Australia
* Copyright (C) 2004 the VideoLAN team
*
* $Id$
*
* Authors: Andre Pang <Andre.Pang@csiro.au>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include "browser_open.h"
#if 0
int browser_Open( const char *psz_url )
{
#ifdef __APPLE__
char *psz_open_commandline;
int i_ret;
if( asprintf( &psz_open_commandline, "/usr/bin/open %s", psz_url ) == -1 )
return -1;
i_ret = system( psz_open_commandline );
free( psz_open_commandline );
return i_ret;
#elif defined( UNDER_CE )
return -1;
#elif defined( WIN32 )
char *psz_open_commandline;
int i_ret;
if( asprintf( &psz_open_commandline, "explorer %s", psz_url ) == -1 )
return -1;
i_ret = system( psz_open_commandline );
free( psz_open_commandline );
return i_ret;
#else
/* Assume we're on a UNIX of some sort */
char *psz_open_commandline;
int i_ret;
/* Debian uses www-browser */
if( asprintf( &psz_open_commandline, "www-browser %s", psz_url ) == -1 )
return -1;
i_ret = system( psz_open_commandline );
free( psz_open_commandline );
if( i_ret == 0 )
return 0;
/* Try mozilla */
if( asprintf( &psz_open_commandline, "mozilla %s", psz_url ) == -1 )
return -1;
i_ret = system( psz_open_commandline );
free( psz_open_commandline );
return i_ret;
#endif
}
#else
int browser_Open( const char *psz_url )
{
(void)psz_url;
return -1;
}
#endif
/*****************************************************************************
* browser_open.h: platform-independent opening of a web browser
*****************************************************************************
* Copyright (C) 2004 Commonwealth Scientific and Industrial Research
* Organisation (CSIRO) Australia
* Copyright (C) 2004 the VideoLAN team
*
* $Id$
*
* Authors: Andre Pang <Andre.Pang@csiro.au>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef __BROWSER_OPEN_H__
#define __BROWSER_OPEN_H__
int browser_Open( const char *psz_url );
#endif /* __BROWSER_OPEN_H__ */
/*****************************************************************************
* cmml.c : CMML annotations/metadata decoder
*****************************************************************************
* Copyright (C) 2003-2004 Commonwealth Scientific and Industrial Research
* Organisation (CSIRO) Australia
* Copyright (C) 2004 the VideoLAN team
*
* $Id$
*
* Author: Andre Pang <Andre.Pang@csiro.au>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_input.h>
#include <vlc_codec.h>
#include <vlc_osd.h>
#include <vlc_charset.h>
#include <vlc_interface.h>
#include "xtag.h"
#undef CMML_DEBUG
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static int OpenDecoder ( vlc_object_t * );
static void CloseDecoder ( vlc_object_t * );
static subpicture_t *DecodeBlock ( decoder_t *, block_t ** );
static void ParseText ( decoder_t *, block_t * );
/*****************************************************************************
* Exported prototypes
*****************************************************************************/
decoder_sys_t *OpenIntf( vlc_object_t * );
void CloseIntf( decoder_sys_t * );
/*****************************************************************************
* Module descriptor.
*****************************************************************************/
vlc_module_begin ()
set_description( N_("CMML annotations decoder") )
set_capability( "decoder", 50 )
set_callbacks( OpenDecoder, CloseDecoder )
add_shortcut( "cmml" )
add_submodule ()
set_capability( "interface", 0 )
set_callbacks( OpenIntf, CloseIntf )
add_shortcut( "cmml" )
vlc_module_end ()
/*****************************************************************************
* OpenDecoder: probe the decoder and return score
*****************************************************************************
* Tries to launch a decoder and return score so that the interface is able
* to chose.
*****************************************************************************/
static int OpenDecoder( vlc_object_t *p_this )
{
decoder_t *p_dec = (decoder_t*)p_this;
input_thread_t * p_input;
if( p_dec->fmt_in.i_codec != VLC_CODEC_CMML )
return VLC_EGENERIC;
p_dec->pf_decode_sub = DecodeBlock;
/* Let other interested modules know that we're a CMML decoder
* We have to set this variable on the input thread, because there's
* typically more than one decoder running so we can't find the CMML
* decoder succesfully with vlc_object_find. (Any hints on how to achieve
* this would be rather appreciated ;) */
p_input = vlc_object_find( p_dec, VLC_OBJECT_INPUT, FIND_ANYWHERE );
if( p_input )
{
vlc_value_t val;
#ifdef CMML_DEBUG
msg_Dbg( p_dec, "p_input is at %p", p_input );
#endif
val.p_address = p_dec;
var_Create( p_input, "has-cmml-decoder",
VLC_VAR_ADDRESS|VLC_VAR_DOINHERIT );
if( var_Set( p_input, "has-cmml-decoder", val ) != VLC_SUCCESS )
msg_Dbg( p_dec, "var_Set of has-cmml-decoder failed" );
vlc_object_release( p_input );
}
/* initialise the CMML responder interface */
p_dec->p_sys = OpenIntf( VLC_OBJECT(p_dec) );
p_dec->fmt_out.i_cat = SPU_ES;
p_dec->fmt_out.i_codec = 0;
return VLC_SUCCESS;
}
/****************************************************************************
* DecodeBlock: the whole thing
****************************************************************************
* This function must be fed with complete subtitles units.
****************************************************************************/
static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
{
subpicture_t *p_spu;
if( !pp_block || *pp_block == NULL )
{
return NULL;
}
ParseText( p_dec, *pp_block );
block_Release( *pp_block );
*pp_block = NULL;
/* allocate an empty subpicture to return. the actual subpicture
* displaying is done in the DisplayAnchor function in intf.c (called from
* DisplayPendingAnchor, which in turn is called from the main RunIntf
* loop). */
p_spu = decoder_NewSubpicture( p_dec );
if( !p_spu )
{
msg_Dbg( p_dec, "couldn't allocate new subpicture" );
return NULL;
}
return p_spu;
}
/*****************************************************************************
* CloseDecoder: clean up the decoder
*****************************************************************************/
static void CloseDecoder( vlc_object_t *p_this )
{
decoder_t *p_dec = (decoder_t *)p_this;
CloseIntf( p_dec->p_sys );
}
/*****************************************************************************
* ParseText: parse an text subtitle packet and send it to the video output
*****************************************************************************/
static void ParseText( decoder_t *p_dec, block_t *p_block )
{
char *psz_subtitle, *psz_cmml, *psz_url;
XTag *p_clip_parser, *p_anchor;
vlc_value_t val;
/* We cannot display a subpicture with no date */
if( p_block->i_pts == 0 )
{
msg_Warn( p_dec, "subtitle without a date" );
return;
}
/* Check validity of packet data */
if( p_block->i_buffer <= 1 || p_block->p_buffer[0] == '\0' )
{
msg_Warn( p_dec, "empty subtitle" );
return;
}
/* get anchor text from CMML */
/* Copy the whole CMML tag into our own buffer:
allocate i_buffer bytes + 1 for the terminating \0 */
if( (psz_cmml = malloc( p_block->i_buffer + 1 )) == NULL )
return;
memcpy( psz_cmml, p_block->p_buffer, p_block->i_buffer );
psz_cmml[p_block->i_buffer] = '\0'; /* terminate the string */
#ifdef CMML_DEBUG
msg_Dbg( p_dec, "psz_cmml is \"%s\"", psz_cmml );
#endif
/* Parse the <clip> part of the CMML */
p_clip_parser = xtag_new_parse( psz_cmml, p_block->i_buffer );
if( !p_clip_parser )
{
msg_Warn( p_dec, "couldn't initialise <clip> parser" );
free( psz_cmml );
return;
}
/* Parse the anchor tag and get its contents */
p_anchor = xtag_first_child( p_clip_parser, "a" );
if( p_anchor != NULL )
{
psz_subtitle = xtag_get_pcdata( p_anchor );
}
else
{
psz_subtitle = strdup( " " );
}
#ifdef CMML_DEBUG
msg_Dbg( p_dec, "psz_subtitle is \"%s\"", psz_subtitle );
#endif
/* get URL from the current clip, if one exists */
psz_url = xtag_get_attribute( p_anchor, "href" );
#ifdef CMML_DEBUG
msg_Dbg( p_dec, "psz_url is \"%s\"", psz_url );
#endif
if( psz_url )
{
char *psz_tmp = strdup( psz_url );
val.p_address = psz_tmp;
if( var_Set( p_dec, "psz-current-anchor-url", val ) != VLC_SUCCESS )
{
var_Create( p_dec, "psz-current-anchor-url",
VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT );
msg_Dbg( p_dec, "creating psz-current-anchor-url" );
if( var_Set( p_dec, "psz-current-anchor-url", val ) != VLC_SUCCESS )
msg_Dbg( p_dec, "var_Set of psz-current-anchor-url failed" );
}
}
if( psz_subtitle )
{
char *psz_tmp = strdup( psz_subtitle );
val.p_address = psz_tmp;
if( var_Set( p_dec, "psz-current-anchor-description", val ) != VLC_SUCCESS )
{
var_Create( p_dec, "psz-current-anchor-description",
VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT );
msg_Dbg( p_dec, "creating psz-current-anchor-description" );
if( var_Set( p_dec, "psz-current-anchor-description", val ) != VLC_SUCCESS )
msg_Dbg( p_dec, "var_Set of psz-current-anchor-description failed" );
}
}
free( psz_subtitle );
free( psz_cmml );
free( p_anchor );
free( p_clip_parser );
free( psz_url );
}
/*****************************************************************************
* history.c: vlc_history_t (web-browser-like back/forward history) handling
*****************************************************************************
* Copyright (C) 2004 Commonwealth Scientific and Industrial Research
* Organisation (CSIRO) Australia
* Copyright (C) 2004 the VideoLAN team
*
* $Id$
*
* Authors: Andre Pang <Andre.Pang@csiro.au>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_input.h>
#include "history.h"
#include "xarray.h"
#ifdef HAVE_STDLIB_H
# include <stdlib.h> /* malloc() */
#endif
#undef HISTORY_DEBUG
/*****************************************************************************
* Local prototypes
*****************************************************************************/
#ifdef HISTORY_DEBUG
static void history_Dump( history_t *p_history );
#endif
/*****************************************************************************
* Local structure lock
*****************************************************************************/
/*****************************************************************************