Changeset 26e60046898da4294f4686d34fbf499385bbf6d1

Show
Ignore:
Timestamp:
11/08/05 00:08:50 (3 years ago)
Author:
Jean-Paul Saman <jpsaman@videolan.org>
git-committer:
Jean-Paul Saman <jpsaman@videolan.org> 1123711730 +0000
git-parent:

[d8fc9f3b89c2b0409bcda5fa81a5e604103c20ef]

git-author:
Jean-Paul Saman <jpsaman@videolan.org> 1123711730 +0000
Message:

Forward port of branches/0.8.1-jpsaman-thedj revision 12070. The OSD menu subsystem consists of two parts a core part (src/osd, include/vlc_osd.h) and a subfilter (modules/video_filter/osdmenu.c). The OSD menu can be used locally or it can be streamed. It depends on the way the functionality is called from the vlc commandline. Currently there is only one way to make the subpictures appear on the video and that is through the rc-interface. The following commands are supported by it: "menu on" (show OSD menu), "menu off" (hide OSD menu), "menu left" (highlight button on the left), "menu right" (highlight button on the right), "menu up" (highlight button above), "menu down" (highlight button below) or "menu select" (perform hotkey action). When there is no button on the left, right, up or down then the menu-command will be ignored.

To stream use a commandline similar to this:

./vlc dvdsimple:///dev/dvd --sub-filter=osdmenu --osdmenu-file=share/osdmenu/default.cfg --extraintf rc --sout '#transcode{sfilter=osdmenu}:std{mux=ts,access=udp,url=127.0.0.1:1234}' -vvvv

For local playback a commandline like this is needed:

./vlc dvdsimple:///dev/dvd --sub-filter=osdmenu --osdmenu-file=share/osdmenu/default.cfg -vvvv

Have fun with the basic functionality - jpsaman.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Makefile.am

    r8fea082 r26e6004  
    113113    include/vlc_meta.h \ 
    114114    include/vlc_objects.h \ 
     115    include/vlc_osd.h \ 
    115116    include/vlc_playlist.h \ 
    116117    include/vlc_spu.h \ 
     
    383384    src/stream_output/sap.c \ 
    384385    src/stream_output/acl.c \ 
     386    src/osd/osd.c \ 
     387    src/osd/osd_widgets.c \ 
     388    src/osd/osd_parser.c \ 
    385389    src/misc/charset.c \ 
    386390    src/misc/httpd.c \ 
     
    814818    done 
    815819 
     820    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu" 
     821    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/dvd" 
     822    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/dvd/selected" 
     823    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/dvd/unselect" 
     824    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/dvd/selection" 
     825    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/dvd/volume" 
     826    for i in $(srcdir)/share/osdmenu/*.*; do \ 
     827      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/ || true ; \ 
     828      unix2dos $(srcdir)/vlc-${VERSION}/osdmenu/`basename $$i` ; \ 
     829    done 
     830    for i in $(srcdir)/share/osdmenu/dvd/*.*; do \ 
     831      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/dvd || true ; \ 
     832    done 
     833    for i in $(srcdir)/share/osdmenu/dvd/unselect/*.*; do \ 
     834      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/dvd/unselect || true ; \ 
     835    done 
     836    for i in $(srcdir)/share/osdmenu/dvd/selected/*.*; do \ 
     837      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/dvd/selected/ || true ; \ 
     838    done 
     839    for i in $(srcdir)/share/osdmenu/dvd/selection/*.*; do \ 
     840      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/dvd/selection/ || true ; \ 
     841    done 
     842    for i in $(srcdir)/share/osdmenu/dvd/volume/*.*; do \ 
     843      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/dvd/volume/ || true ; \ 
     844    done 
     845 
     846    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/default" 
     847    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/default/selected" 
     848    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/default/selection" 
     849    mkdir -p "$(srcdir)/vlc-${VERSION}/osdmenu/default/volume" 
     850    for i in $(srcdir)/share/osdmenu/default/*.*; do \ 
     851      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/default || true ; \ 
     852    done 
     853    for i in $(srcdir)/share/osdmenu/default/selected/*.*; do \ 
     854      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/default/selected/ || true ; \ 
     855    done 
     856    for i in $(srcdir)/share/osdmenu/default/selection/*.*; do \ 
     857      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/default/selection/ || true ; \ 
     858    done 
     859    for i in $(srcdir)/share/osdmenu/default/volume/*.*; do \ 
     860      cp $$i $(srcdir)/vlc-${VERSION}/osdmenu/default/volume/ || true ; \ 
     861    done 
     862 
    816863    mkdir -p "$(top_builddir)/vlc-${VERSION}/http/admin" 
    817864    mkdir -p "$(top_builddir)/vlc-${VERSION}/http/vlm" 
  • configure.ac

    r4d611bb r26e6004  
    26902690    VLC_ADD_LDFLAGS([png],[-lpng -lz]) 
    26912691    VLC_ADD_PLUGINS([png]) 
     2692    VLC_ADD_PLUGINS([osdmenu]) 
    26922693    AC_DEFINE(HAVE_LIBPNG, [], [Define if you have the PNG library: libpng])], 
    26932694    [],[-lz]) 
  • include/stream_output.h

    r53d6bb5 r26e6004  
    22 * stream_output.h : stream output module 
    33 ***************************************************************************** 
    4  * Copyright (C) 2002 the VideoLAN team 
     4 * Copyright (C) 2002-2005 the VideoLAN team 
    55 * $Id$ 
    66 * 
     
    88 *          Laurent Aimar <fenrir@via.ecp.fr> 
    99 *          Eric Petit <titer@videolan.org> 
     10 *          Jean-Paul Saman <jpsaman #_at_# m2x.nl> 
    1011 * 
    1112 * This program is free software; you can redistribute it and/or modify 
     
    207208    char              *psz_next; 
    208209 
     210    /* Subpicture unit */ 
     211    spu_t             *p_spu; 
     212     
    209213    /* add, remove a stream */ 
    210214    sout_stream_id_t *(*pf_add)( sout_stream_t *, es_format_t * ); 
  • include/vlc_common.h

    rd71f0a6 r26e6004  
    405405typedef struct opengl_t     opengl_t; 
    406406typedef struct opengl_sys_t opengl_sys_t; 
     407 
     408/* osdmenu */ 
     409typedef struct osd_menu_t   osd_menu_t; 
     410typedef struct osd_state_t  osd_state_t; 
     411typedef struct osd_event_t  osd_event_t; 
     412typedef struct osd_button_t osd_button_t; 
     413typedef struct osd_menu_state_t osd_menu_state_t; 
    407414 
    408415/* VLM */ 
  • include/vlc_objects.h

    rfe087a3 r26e6004  
    6060#define VLC_OBJECT_SD         (-26) 
    6161#define VLC_OBJECT_XML        (-27) 
     62#define VLC_OBJECT_OSDMENU    (-28) 
    6263 
    6364#define VLC_OBJECT_GENERIC  (-666) 
  • include/vlc_symbols.h

    r1da4cee r26e6004  
    392392    int (*vlc_scandir_inner) (const char *name, struct dirent ***namelist, int (*filter) ( const struct dirent * ), int (*compar) ( const struct dirent **, const struct dirent ** )); 
    393393    int (*vlc_alphasort_inner) (const struct dirent **a, const struct dirent **b); 
     394    osd_state_t * (*__osd_StateChange_inner) (osd_state_t *, const int); 
     395    picture_t * (*osd_Slider_inner) (int i_width, int i_height, int i_position, short i_type); 
     396    void (*osd_ConfigUnload_inner) (vlc_object_t *, osd_menu_t **); 
     397    void (*__osd_MenuShow_inner) (vlc_object_t *); 
     398    picture_t * (*osd_Icon_inner) (int i_width, int i_height, short i_type); 
     399    void (*__osd_VolumeDown_inner) (vlc_object_t *); 
     400    void (*__osd_MenuNext_inner) (vlc_object_t *); 
     401    void (*__osd_MenuDelete_inner) (vlc_object_t *, osd_menu_t *); 
     402    void (*__osd_MenuHide_inner) (vlc_object_t *); 
     403    int (*osd_ConfigLoader_inner) (vlc_object_t *, const char *, osd_menu_t **); 
     404    void (*__osd_MenuUp_inner) (vlc_object_t *); 
     405    void (*__osd_MenuDown_inner) (vlc_object_t *); 
     406    osd_menu_t * (*__osd_MenuCreate_inner) (vlc_object_t *, const char *); 
     407    void (*__osd_MenuPrev_inner) (vlc_object_t *); 
     408    void (*__osd_VolumeUp_inner) (vlc_object_t *); 
     409    void (*__osd_MenuActivate_inner) (vlc_object_t *); 
    394410}; 
    395411# if defined (__PLUGIN__) 
     
    767783#  define vlc_scandir (p_symbols)->vlc_scandir_inner 
    768784#  define vlc_alphasort (p_symbols)->vlc_alphasort_inner 
     785#  define __osd_StateChange (p_symbols)->__osd_StateChange_inner 
     786#  define osd_Slider (p_symbols)->osd_Slider_inner 
     787#  define osd_ConfigUnload (p_symbols)->osd_ConfigUnload_inner 
     788#  define __osd_MenuShow (p_symbols)->__osd_MenuShow_inner 
     789#  define osd_Icon (p_symbols)->osd_Icon_inner 
     790#  define __osd_VolumeDown (p_symbols)->__osd_VolumeDown_inner 
     791#  define __osd_MenuNext (p_symbols)->__osd_MenuNext_inner 
     792#  define __osd_MenuDelete (p_symbols)->__osd_MenuDelete_inner 
     793#  define __osd_MenuHide (p_symbols)->__osd_MenuHide_inner 
     794#  define osd_ConfigLoader (p_symbols)->osd_ConfigLoader_inner 
     795#  define __osd_MenuUp (p_symbols)->__osd_MenuUp_inner 
     796#  define __osd_MenuDown (p_symbols)->__osd_MenuDown_inner 
     797#  define __osd_MenuCreate (p_symbols)->__osd_MenuCreate_inner 
     798#  define __osd_MenuPrev (p_symbols)->__osd_MenuPrev_inner 
     799#  define __osd_VolumeUp (p_symbols)->__osd_VolumeUp_inner 
     800#  define __osd_MenuActivate (p_symbols)->__osd_MenuActivate_inner 
    769801# elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__) 
    770802/****************************************************************** 
     
    11451177    ((p_symbols)->vlc_scandir_inner) = vlc_scandir; \ 
    11461178    ((p_symbols)->vlc_alphasort_inner) = vlc_alphasort; \ 
     1179    ((p_symbols)->__osd_StateChange_inner) = __osd_StateChange; \ 
     1180    ((p_symbols)->osd_Slider_inner) = osd_Slider; \ 
     1181    ((p_symbols)->osd_ConfigUnload_inner) = osd_ConfigUnload; \ 
     1182    ((p_symbols)->__osd_MenuShow_inner) = __osd_MenuShow; \ 
     1183    ((p_symbols)->osd_Icon_inner) = osd_Icon; \ 
     1184    ((p_symbols)->__osd_VolumeDown_inner) = __osd_VolumeDown; \ 
     1185    ((p_symbols)->__osd_MenuNext_inner) = __osd_MenuNext; \ 
     1186    ((p_symbols)->__osd_MenuDelete_inner) = __osd_MenuDelete; \ 
     1187    ((p_symbols)->__osd_MenuHide_inner) = __osd_MenuHide; \ 
     1188    ((p_symbols)->osd_ConfigLoader_inner) = osd_ConfigLoader; \ 
     1189    ((p_symbols)->__osd_MenuUp_inner) = __osd_MenuUp; \ 
     1190    ((p_symbols)->__osd_MenuDown_inner) = __osd_MenuDown; \ 
     1191    ((p_symbols)->__osd_MenuCreate_inner) = __osd_MenuCreate; \ 
     1192    ((p_symbols)->__osd_MenuPrev_inner) = __osd_MenuPrev; \ 
     1193    ((p_symbols)->__osd_VolumeUp_inner) = __osd_VolumeUp; \ 
     1194    ((p_symbols)->__osd_MenuActivate_inner) = __osd_MenuActivate; \ 
    11471195    (p_symbols)->net_ConvertIPv4_deprecated = NULL; \ 
    11481196    (p_symbols)->vlc_fix_readdir_charset_deprecated = NULL; \ 
  • modules/LIST

    r44d19ee r26e6004  
    343343 * opie: interface for Opie using QT/Embedded library. 
    344344 
     345 * osdmenu: video_filter for displaying and streaming a On Screen Display menu 
     346 
    345347 * oss: audio output module using the OSS /dev/dsp interface. 
    346348  
  • modules/codec/dvbsub.c

    r5a896a3 r26e6004  
    15581558} 
    15591559 
     1560/* FIXME: this routine is a hack to convert VLC_FOURCC('Y','U','V','A')  
     1561 *        into VLC_FOURCC('Y','U','V','P') 
     1562 */ 
     1563static subpicture_t *YuvaYuvp( encoder_t *p_enc, subpicture_t *p_subpic ) 
     1564{ 
     1565    subpicture_region_t *p_region = NULL; 
     1566      
     1567    for( p_region = p_subpic->p_region; p_region; p_region = p_region->p_next ) 
     1568    { 
     1569        video_format_t *p_fmt = &p_region->fmt; 
     1570        int i = 0, j = 0, n = 0, p = 0; 
     1571        int i_max_entries = 256; 
     1572 
     1573#ifdef RANDOM_DITHERING 
     1574        int i_seed = 0xdeadbeef; /* random seed */ 
     1575#else 
     1576        int *pi_delta; 
     1577#endif 
     1578        int i_pixels = p_region->picture.p[0].i_visible_lines 
     1579                        * p_region->picture.p[0].i_pitch; 
     1580        int i_iterator = p_region->picture.p[0].i_visible_lines * 3 / 4 
     1581                            * p_region->picture.p[0].i_pitch 
     1582                        + p_region->picture.p[0].i_pitch * 1 / 3; 
     1583        int i_tolerance = 0; 
     1584     
     1585        p_fmt->i_chroma = VLC_FOURCC('Y','U','V','P'); 
     1586        p_fmt->p_palette = (video_palette_t *) malloc( sizeof( video_palette_t ) ); 
     1587        p_fmt->p_palette->i_entries = 0; 
     1588     
     1589        /* Find best iterator using Euclide’s algorithm */ 
     1590        for( ; i_iterator > 1 ; i_iterator-- ) 
     1591        { 
     1592            int a = i_pixels; 
     1593            int b = i_iterator; 
     1594            int c; 
     1595     
     1596            while( b ) 
     1597            { 
     1598                c = a % b; 
     1599                a = b; 
     1600                b = c; 
     1601            } 
     1602     
     1603            if( a == 1 ) 
     1604            { 
     1605                break; 
     1606            } 
     1607        } 
     1608     
     1609        /* Count colors, build best palette */ 
     1610        for( i_tolerance = 0; i_tolerance < 128; i_tolerance++ ) 
     1611        { 
     1612            vlc_bool_t b_success = VLC_TRUE; 
     1613            p_fmt->p_palette->i_entries = 0; 
     1614     
     1615            for( i = 0; i < i_pixels ; ) 
     1616            { 
     1617                uint8_t y, u, v, a; 
     1618                y = p_region->picture.p[0].p_pixels[i]; 
     1619                u = p_region->picture.p[1].p_pixels[i]; 
     1620                v = p_region->picture.p[2].p_pixels[i]; 
     1621                a = p_region->picture.p[3].p_pixels[i]; 
     1622                for( j = 0; j < p_fmt->p_palette->i_entries; j++ ) 
     1623                { 
     1624                    if( abs((int)p_fmt->p_palette->palette[j][0] - (int)y) <= i_tolerance && 
     1625                        abs((int)p_fmt->p_palette->palette[j][1] - (int)u) <= i_tolerance && 
     1626                        abs((int)p_fmt->p_palette->palette[j][2] - (int)v) <= i_tolerance && 
     1627                        abs((int)p_fmt->p_palette->palette[j][3] - (int)a) <= i_tolerance / 2 ) 
     1628                    { 
     1629                        break; 
     1630                    } 
     1631                } 
     1632                if( j == p_fmt->p_palette->i_entries ) 
     1633                { 
     1634                    p_fmt->p_palette->palette[j][0] = y; 
     1635                    p_fmt->p_palette->palette[j][1] = u; 
     1636                    p_fmt->p_palette->palette[j][2] = v; 
     1637                    p_fmt->p_palette->palette[j][3] = a; 
     1638                    p_fmt->p_palette->i_entries++; 
     1639                } 
     1640                if( p_fmt->p_palette->i_entries >= i_max_entries ) 
     1641                { 
     1642                    b_success = VLC_FALSE; 
     1643                    break; 
     1644                } 
     1645                i += i_iterator; 
     1646                if( i > i_pixels ) 
     1647                { 
     1648                    i -= i_pixels; 
     1649                } 
     1650            } 
     1651     
     1652            if( b_success ) 
     1653            { 
     1654                break; 
     1655            } 
     1656        } 
     1657     
     1658#if DEBUG_DVBSUB 
     1659        msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries ); 
     1660#endif 
     1661 
     1662#ifndef RANDOM_DITHERING 
     1663        pi_delta = malloc( ( p_region->picture.p[0].i_pitch + 1 ) 
     1664                            * sizeof(int) * 4  ); 
     1665        for( i = 0; i < (p_region->picture.p[0].i_pitch + 1) * 4 ; i++ ) 
     1666        { 
     1667            pi_delta[ i ] = 0; 
     1668        } 
     1669#endif 
     1670 
     1671        /* Fill image with our new colours */ 
     1672        for( p = 0; p < p_region->picture.p[0].i_visible_lines ; p++ ) 
     1673        { 
     1674            int i_ydelta = 0, i_udelta = 0, i_vdelta = 0, i_adelta = 0; 
     1675     
     1676            for( n = 0; n < p_region->picture.p[0].i_pitch ; n++ ) 
     1677            { 
     1678                int i_offset = p * p_region->picture.p[0].i_pitch + n; 
     1679                int y, u, v, a; 
     1680                int i_mindist, i_best; 
     1681     
     1682                y = (int)p_region->picture.p[0].p_pixels[i_offset]; 
     1683                u = (int)p_region->picture.p[1].p_pixels[i_offset]; 
     1684                v = (int)p_region->picture.p[2].p_pixels[i_offset]; 
     1685                a = (int)p_region->picture.p[3].p_pixels[i_offset]; 
     1686     
     1687                /* Add dithering compensation */ 
     1688#ifdef RANDOM_DITHERING 
     1689                y += ((i_seed & 0xff) - 0x80) * i_tolerance / 0x80; 
     1690                u += (((i_seed >> 8) & 0xff) - 0x80) * i_tolerance / 0x80; 
     1691                v += (((i_seed >> 16) & 0xff) - 0x80) * i_tolerance / 0x80; 
     1692                a += (((i_seed >> 24) & 0xff) - 0x80) * i_tolerance / 0x80; 
     1693#else 
     1694                y += i_ydelta + pi_delta[ n * 4 ]; 
     1695                u += i_udelta + pi_delta[ n * 4 + 1 ]; 
     1696                v += i_vdelta + pi_delta[ n * 4 + 2 ]; 
     1697                a += i_adelta + pi_delta[ n * 4 + 3 ]; 
     1698#endif 
     1699 
     1700                /* Find best colour in palette */ 
     1701                for( i_mindist = 99999999, i_best = 0, j = 0; j < p_fmt->p_palette->i_entries; j++ ) 
     1702                { 
     1703                    int i_dist = 0; 
     1704     
     1705                    i_dist += abs((int)p_fmt->p_palette->palette[j][0] - y); 
     1706                    i_dist += abs((int)p_fmt->p_palette->palette[j][1] - u); 
     1707                    i_dist += abs((int)p_fmt->p_palette->palette[j][2] - v); 
     1708                    i_dist += 2 * abs((int)p_fmt->p_palette->palette[j][3] - a); 
     1709     
     1710                    if( i_dist < i_mindist ) 
     1711                    { 
     1712                        i_mindist = i_dist; 
     1713                        i_best = j; 
     1714                    } 
     1715                } 
     1716     
     1717                /* Set pixel to best color */ 
     1718                p_region->picture.p[0].p_pixels[i_offset] = i_best; 
     1719     
     1720                /* Update dithering state */ 
     1721#ifdef RANDOM_DITHERING 
     1722                i_seed = (i_seed * 0x1283837) ^ 0x789479 ^ (i_seed >> 13); 
     1723#else 
     1724                i_ydelta = y - (int)p_fmt->p_palette->palette[i_best][0]; 
     1725                i_udelta = u - (int)p_fmt->p_palette->palette[i_best][1]; 
     1726                i_vdelta = v - (int)p_fmt->p_palette->palette[i_best][2]; 
     1727                i_adelta = a - (int)p_fmt->p_palette->palette[i_best][3]; 
     1728                pi_delta[ n * 4 ] = i_ydelta * 3 / 8; 
     1729                pi_delta[ n * 4 + 1 ] = i_udelta * 3 / 8; 
     1730                pi_delta[ n * 4 + 2 ] = i_vdelta * 3 / 8; 
     1731                pi_delta[ n * 4 + 3 ] = i_adelta * 3 / 8; 
     1732                i_ydelta = i_ydelta * 5 / 8; 
     1733                i_udelta = i_udelta * 5 / 8; 
     1734                i_vdelta = i_vdelta * 5 / 8; 
     1735                i_adelta = i_adelta * 5 / 8; 
     1736#endif 
     1737            } 
     1738        } 
     1739#ifndef RANDOM_DITHERING 
     1740        free( pi_delta ); 
     1741#endif 
     1742 
     1743        /* pad palette */ 
     1744        for( i = p_fmt->p_palette->i_entries; i < i_max_entries; i++ ) 
     1745        { 
     1746            p_fmt->p_palette->palette[i][0] = 0; 
     1747            p_fmt->p_palette->palette[i][1] = 0; 
     1748            p_fmt->p_palette->palette[i][2] = 0; 
     1749            p_fmt->p_palette->palette[i][3] = 0; 
     1750        } 
     1751        p_fmt->p_palette->i_entries = i_max_entries; 
     1752#if DEBUG_DVBSUB 
     1753        msg_Dbg( p_enc, "best palette has %d colors", p_fmt->p_palette->i_entries ); 
     1754#endif 
     1755    } 
     1756    return p_subpic; 
     1757} /* End of hack */ 
     1758 
    15601759/**************************************************************************** 
    15611760 * Encode: the whole thing 
     
    15631762static block_t *Encode( encoder_t *p_enc, subpicture_t *p_subpic ) 
    15641763{ 
     1764    subpicture_t *p_temp = NULL; 
     1765    subpicture_region_t *p_region = NULL; 
    15651766    bs_t bits, *s = &bits; 
    15661767    block_t *p_block; 
    15671768 
    1568     if( !p_subpic || !p_subpic->p_region ) return 0; 
    1569  
     1769    if( !p_subpic || !p_subpic->p_region ) return NULL; 
     1770     
     1771    /* FIXME: this is a hack to convert VLC_FOURCC('Y','U','V','A') into 
     1772     *  VLC_FOURCC('Y','U','V','P') 
     1773     */ 
     1774    p_region = p_subpic->p_region; 
     1775    if( p_region->fmt.i_chroma == VLC_FOURCC('Y','U','V','A') ) 
     1776    { 
     1777        p_temp = YuvaYuvp( p_enc, p_subpic ); 
     1778        if( !p_temp ) 
     1779        { 
     1780            msg_Dbg( p_enc, "no picture in subpicture" ); 
     1781            return NULL; 
     1782        } 
     1783        p_region = p_subpic->p_region; 
     1784    } 
     1785    /* Sanity check */ 
     1786    if( !p_region ) return NULL; 
     1787    if( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') && 
     1788        p_region->fmt.i_chroma != VLC_FOURCC('Y','U','V','P') ) return NULL; 
     1789     
     1790    if( p_region->fmt.p_palette && 
     1791        ( p_region->fmt.p_palette->i_entries != 4 ) && 
     1792        ( p_region->fmt.p_palette->i_entries != 16 ) && 
     1793        ( p_region->fmt.p_palette->i_entries != 256 ) ) 
     1794    { 
     1795        msg_Err( p_enc, "subpicture palette (%d) not handled", 
     1796                    p_region->fmt.p_palette->i_entries ); 
     1797        return NULL; 
     1798    } 
     1799    /* End of hack */ 
     1800     
    15701801#if DEBUG_DVBSUB 
    15711802    msg_Dbg( p_enc, "encoding subpicture" ); 
  • modules/control/rc.c

    r17950a1 r26e6004  
    66 * 
    77 * Author: Peter Surda <shurdeek@panorama.sth.ac.at> 
     8 *         Jean-Paul Saman <jpsaman #_at_# m2x _replaceWith#dot_ nl> 
    89 * 
    910 * This program is free software; you can redistribute it and/or modify 
     
    3738#include <vlc/aout.h> 
    3839#include <vlc/vout.h> 
     40#include <vlc_osd.h> 
    3941 
    4042#ifdef HAVE_UNISTD_H 
     
    5961 
    6062#define MAX_LINE_LENGTH 256 
     63#define STATUS_CHANGE "status change: " 
    6164 
    6265/***************************************************************************** 
     
    6669static void Deactivate   ( vlc_object_t * ); 
    6770static void Run          ( intf_thread_t * ); 
     71 
     72static void Help         ( intf_thread_t *, vlc_bool_t ); 
    6873 
    6974static vlc_bool_t ReadCommand( intf_thread_t *, char *, int * ); 
     
    8792static int  AudioConfig  ( vlc_object_t *, char const *, 
    8893                           vlc_value_t, vlc_value_t, void * ); 
     94static int  Menu         ( vlc_object_t *, char const *, 
     95                           vlc_value_t, vlc_value_t, void * ); 
     96 
     97/* Status Callbacks */ 
     98static int TimeOffsetChanged( vlc_object_t *, char const *, 
     99                              vlc_value_t, vlc_value_t , void * ); 
     100static int VolumeChanged    ( vlc_object_t *, char const *, 
     101                              vlc_value_t, vlc_value_t, void * ); 
     102static int StateChanged     ( vlc_object_t *, char const *, 
     103                              vlc_value_t, vlc_value_t, void * ); 
     104static int RateChanged      ( vlc_object_t *, char const *, 
     105                              vlc_value_t, vlc_value_t, void * ); 
    89106 
    90107struct intf_sys_t 
     
    94111    char *psz_unix_path; 
    95112 
     113    /* status changes */ 
     114    vlc_mutex_t       status_lock; 
     115    playlist_status_t i_last_state; 
     116     
    96117#ifdef WIN32 
    97118    HANDLE hConsoleIn; 
     
    109130    va_list args; 
    110131    va_start( args, psz_fmt ); 
    111     if( p_intf->p_sys->i_socket == -1 ) vprintf( psz_fmt, args ); 
     132    if( p_intf->p_sys->i_socket == -1 ) 
     133        vprintf( psz_fmt, args ); 
    112134    else 
    113     { net_vaPrintf( p_intf, p_intf->p_sys->i_socket, NULL, psz_fmt, args ); 
    114       net_Printf( VLC_OBJECT(p_intf), p_intf->p_sys->i_socket, NULL, "\r" ); } 
     135    { 
     136        net_vaPrintf( p_intf, p_intf->p_sys->i_socket, NULL, psz_fmt, args ); 
     137        net_Printf( VLC_OBJECT(p_intf), p_intf->p_sys->i_socket, NULL, "\r" ); 
     138    } 
    115139    va_end( args ); 
    116140} 
     
    171195    playlist_t *p_playlist; 
    172196    char *psz_host, *psz_unix_path; 
    173     int *pi_socket = NULL; 
     197    int *pi_socket = NULL; 
    174198 
    175199#if defined(HAVE_ISATTY) && !defined(WIN32) 
     
    274298    p_intf->p_sys->i_socket = -1; 
    275299    p_intf->p_sys->psz_unix_path = psz_unix_path; 
    276  
     300    vlc_mutex_init( p_intf, &p_intf->p_sys->status_lock ); 
     301    p_intf->p_sys->i_last_state = PLAYLIST_STOPPED; 
     302     
    277303    /* Non-buffered stdout */ 
    278304    setvbuf( stdout, (char *)NULL, _IOLBF, 0 ); 
     
    319345        free( p_intf->p_sys->psz_unix_path ); 
    320346    } 
     347    vlc_mutex_destroy( &p_intf->p_sys->status_lock );     
    321348    free( p_intf->p_sys ); 
    322349} 
     
    438465    var_Create( p_intf, "logo-transparency", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ); 
    439466    var_AddCallback( p_intf, "logo-transparency", Other, NULL ); 
    440      
    441      
     467 
     468    /* OSD menu commands */ 
     469    var_Create( p_intf, "menu", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); 
     470    var_AddCallback( p_intf, "menu", Menu, NULL );  
     471 
     472    /* DVD commands */ 
    442473    var_Create( p_intf, "pause", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); 
    443474    var_AddCallback( p_intf, "pause", Input, NULL ); 
     
    461492    var_Create( p_intf, "rewind", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); 
    462493    var_AddCallback( p_intf, "rewind", Input, NULL ); 
    463  
     494    var_Create( p_intf, "faster", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); 
     495    var_AddCallback( p_intf, "faster", Input, NULL ); 
     496    var_Create( p_intf, "slower", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); 
     497    var_AddCallback( p_intf, "slower", Input, NULL ); 
     498    var_Create( p_intf, "normal", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); 
     499    var_AddCallback( p_intf, "normal", Input, NULL ); 
     500 
     501    /* audio commands */ 
    464502    var_Create( p_intf, "volume", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); 
    465503    var_AddCallback( p_intf, "volume", Volume, NULL ); 
     
    473511    var_AddCallback( p_intf, "achan", AudioConfig, NULL ); 
    474512 
     513    /* status callbacks */ 
     514    /* Listen to audio volume updates */ 
     515    var_AddCallback( p_intf->p_vlc, "audio-volume", VolumeChanged, p_intf ); 
     516     
    475517#ifdef WIN32 
    476518    /* Get the file descriptor of the console input */ 
     
    515557                } 
    516558            } 
     559            /* New input has been registered */ 
     560            if( p_input ) 
     561            { 
     562                if( !p_input->b_dead || !p_input->b_die ) 
     563                { 
     564                    msg_rc( STATUS_CHANGE "( New input: %s )\r\n", p_input->input.p_item->psz_uri ); 
     565                    msg_rc( STATUS_CHANGE "( audio volume: %d )\r\n", config_GetInt( p_intf, "volume" )); 
     566                } 
     567                var_AddCallback( p_input, "state", StateChanged, p_intf ); 
     568                var_AddCallback( p_input, "rate-faster", RateChanged, p_intf ); 
     569                var_AddCallback( p_input, "rate-slower", RateChanged, p_intf ); 
     570                var_AddCallback( p_input, "rate", RateChanged, p_intf ); 
     571                var_AddCallback( p_input, "time-offset", TimeOffsetChanged, p_intf ); 
     572            } 
    517573        } 
    518574        else if( p_input->b_dead ) 
    519575        { 
     576            var_DelCallback( p_input, "state", StateChanged, p_intf ); 
     577            var_DelCallback( p_input, "rate-faster", RateChanged, p_intf ); 
     578            var_DelCallback( p_input, "rate-slower", RateChanged, p_intf ); 
     579            var_DelCallback( p_input, "rate", RateChanged, p_intf ); 
     580            var_DelCallback( p_input, "time-offset", TimeOffsetChanged, p_intf ); 
    520581            vlc_object_release( p_input ); 
    521582            p_input = NULL; 
     583 
     584            if( p_playlist ) 
     585            { 
     586                vlc_mutex_lock( &p_playlist->object_lock ); 
     587                p_intf->p_sys->i_last_state = (int) PLAYLIST_STOPPED; 
     588                msg_rc( STATUS_CHANGE "( stop state: 0 )\r\n" ); 
     589                vlc_mutex_unlock( &p_playlist->object_lock ); 
     590            } 
     591        } 
     592         
     593        if( (p_input != NULL) && !p_input->b_dead && !p_input->b_die && 
     594            (p_playlist != NULL) ) 
     595        { 
     596            vlc_mutex_lock( &p_playlist->object_lock ); 
     597            if( (p_intf->p_sys->i_last_state != p_playlist->status.i_status) && 
     598                (p_playlist->status.i_status == PLAYLIST_STOPPED) ) 
     599            { 
     600                p_intf->p_sys->i_last_state = PLAYLIST_STOPPED; 
     601                msg_rc( STATUS_CHANGE "( stop state: 0 )\r\n" ); 
     602            } 
     603            else if( (p_intf->p_sys->i_last_state != p_playlist->status.i_status) && 
     604                (p_playlist->status.i_status == PLAYLIST_RUNNING) ) 
     605            { 
     606                p_intf->p_sys->i_last_state = p_playlist->status.i_status; 
     607                msg_rc( STATUS_CHANGE "( play state: 1 )\r\n" ); 
     608            } 
     609            else if( (p_intf->p_sys->i_last_state != p_playlist->status.i_status) && 
     610                (p_playlist->status.i_status == PLAYLIST_PAUSED) ) 
     611            { 
     612                p_intf->p_sys->i_last_state = p_playlist->status.i_status; 
     613                msg_rc( STATUS_CHANGE "( pause state: 2 )\r\n" ); 
     614            } 
     615            vlc_mutex_unlock( &p_playlist->object_lock ); 
    522616        } 
    523617 
     
    633727            { 
    634728                msg_rc( "1\n" ); 
     729 
     730                /* FIXME: This is a hack */ 
     731                /* Replay the current state of the system. */ 
     732                msg_rc( STATUS_CHANGE "( New input: %s )\r\n", p_input->input.p_item->psz_uri ); 
     733                msg_rc( STATUS_CHANGE "( audio volume: %d )\r\n", config_GetInt( p_intf, "volume" )); 
     734 
     735                if( p_playlist ) 
     736                { 
     737                    vlc_mutex_lock( &p_playlist->object_lock ); 
     738                    switch( p_playlist->status.i_status ) 
     739                    { 
     740                        case PLAYLIST_STOPPED: 
     741                            msg_rc( STATUS_CHANGE "( stop state: 0 )\r\n" ); 
     742                            break; 
     743                        case PLAYLIST_RUNNING: 
     744                            msg_rc( STATUS_CHANGE "( play state: %d )\r\n", var_GetInteger( p_input, "state" ) ); 
     745                            break; 
     746                        case PLAYLIST_PAUSED: 
     747                            msg_rc( STATUS_CHANGE "( pause state: 2 )\r\n" ); 
     748                            break; 
     749                        default: 
     750                            msg_rc( STATUS_CHANGE "( state unknown )\r\n" ); 
     751                            break; 
     752                    } 
     753                    vlc_mutex_unlock( &p_playlist->object_lock ); 
     754                } /* End of current playlist status */                 
    635755            } 
    636756        } 
     
    678798                 b_longhelp = VLC_TRUE; 
    679799            else b_longhelp = VLC_FALSE; 
    680              
    681             msg_rc(_("+----[ Remote control commands ]\n")); 
    682             msg_rc(  "| \n"); 
    683             msg_rc(_("| add XYZ  . . . . . . . . . . add XYZ to playlist\n")); 
    684             msg_rc(_("| playlist . . .  show items currently in playlist\n")); 
    685             msg_rc(_("| play . . . . . . . . . . . . . . . . play stream\n")); 
    686             msg_rc(_("| stop . . . . . . . . . . . . . . . . stop stream\n")); 
    687             msg_rc(_("| next . . . . . . . . . . . .  next playlist item\n")); 
    688             msg_rc(_("| prev . . . . . . . . . .  previous playlist item\n")); 
    689             msg_rc(_("| goto . . . . . . . . . . . .  goto item at index\n")); 
    690             msg_rc(_("| title [X]  . . . . set/get title in current item\n")); 
    691             msg_rc(_("| title_n  . . . . . .  next title in current item\n")); 
    692             msg_rc(_("| title_p  . . . .  previous title in current item\n")); 
    693             msg_rc(_("| chapter [X]  . . set/get chapter in current item\n")); 
    694             msg_rc(_("| chapter_n  . . . .  next chapter in current item\n")); 
    695             msg_rc(_("| chapter_p  . .  previous chapter in current item\n")); 
    696             msg_rc(  "| \n"); 
    697             msg_rc(_("| seek X . seek in seconds, for instance `seek 12'\n")); 
    698             msg_rc(_("| pause  . . . . . . . . . . . . . .  toggle pause\n")); 
    699             msg_rc(_("| fastforward  . . . . . .  .  set to maximum rate\n")); 
    700             msg_rc(_("| rewind  . . . . . . . . . .  set to minimum rate\n")); 
    701             msg_rc(_("| f  . . . . . . . . . . . . . . toggle fullscreen\n")); 
    702             msg_rc(_("| info . . .  information about the current stream\n")); 
    703             msg_rc(  "| \n"); 
    704             msg_rc(_("| volume [X] . . . . . . . .  set/get audio volume\n")); 
    705             msg_rc(_("| volup [X]  . . . . .  raise audio volume X steps\n")); 
    706             msg_rc(_("| voldown [X]  . . . .  lower audio volume X steps\n")); 
    707             msg_rc(_("| adev [X] . . . . . . . . .  set/get audio device\n")); 
    708             msg_rc(_("| achan [X]. . . . . . . .  set/get audio channels\n")); 
    709             msg_rc(  "| \n"); 
    710              
    711             if (b_longhelp) 
    712             { 
    713                 msg_rc(_("| marq-marquee STRING  . . overlay STRING in video\n")); 
    714                 msg_rc(_("| marq-x X . . . . . . . . . . . .offset from left\n")); 
    715                 msg_rc(_("| marq-y Y . . . . . . . . . . . . offset from top\n")); 
    716                 msg_rc(_("| marq-position #. . .  .relative position control\n")); 
    717                 msg_rc(_("| marq-color # . . . . . . . . . . font color, RGB\n")); 
    718                 msg_rc(_("| marq-opacity # . . . . . . . . . . . . . opacity\n")); 
    719                 msg_rc(_("| marq-timeout T. . . . . . . . . . timeout, in ms\n")); 
    720                 msg_rc(_("| marq-size # . . . . . . . . font size, in pixels\n")); 
    721                 msg_rc(  "| \n"); 
    722                 msg_rc(_("| time-format STRING . . . overlay STRING in video\n")); 
    723                 msg_rc(_("| time-x X . . . . . . . . . . . .offset from left\n")); 
    724                 msg_rc(_("| time-y Y . . . . . . . . . . . . offset from top\n")); 
    725                 msg_rc(_("| time-position #. . . . . . . . relative position\n")); 
    726                 msg_rc(_("| time-color # . . . . . . . . . . font color, RGB\n")); 
    727                 msg_rc(_("| time-opacity # . . . . . . . . . . . . . opacity\n")); 
    728                 msg_rc(_("| time-size # . . . . . . . . font size, in pixels\n")); 
    729                 msg_rc(  "| \n"); 
    730                 msg_rc(_("| logo-file STRING . . . the overlay file path/name\n")); 
    731                 msg_rc(_("| logo-x X . . . . . . . . . . . .offset from left\n")); 
    732                 msg_rc(_("| logo-y Y . . . . . . . . . . . . offset from top\n")); 
    733                 msg_rc(_("| logo-position #. . . . . . . . relative position\n")); 
    734                 msg_rc(_("| logo-transparency #. . . . . . . . .transparency\n")); 
    735                 msg_rc(  "| \n"); 
    736                 msg_rc(_("| mosaic-alpha # . . . . . . . . . . . . . . alpha\n")); 
    737                 msg_rc(_("| mosaic-height #. . . . . . . . . . . . . .height\n")); 
    738                 msg_rc(_("| mosaic-width # . . . . . . . . . . . . . . width\n")); 
    739                 msg_rc(_("| mosaic-xoffset # . . . .top left corner position\n")); 
    740                 msg_rc(_("| mosaic-yoffset # . . . .top left corner position\n")); 
    741                 msg_rc(_("| mosaic-align 0..2,4..6,8..10. . .mosaic alignment\n")); 
    742                 msg_rc(_("| mosaic-vborder # . . . . . . . . vertical border\n")); 
    743                 msg_rc(_("| mosaic-hborder # . . . . . . . horizontal border\n")); 
    744                 msg_rc(_("| mosaic-position {0=auto,1=fixed} . . . .position\n")); 
    745                 msg_rc(_("| mosaic-rows #. . . . . . . . . . .number of rows\n")); 
    746                 msg_rc(_("| mosaic-cols #. . . . . . . . . . .number of cols\n")); 
    747                 msg_rc(_("| mosaic-keep-aspect-ratio {0,1} . . .aspect ratio\n")); 
    748                 msg_rc(  "| \n"); 
    749             }     
    750             msg_rc(_("| help . . . . . . . . . . . . . this help message\n")); 
    751             msg_rc(_("| longhelp . . . . . . . . . a longer help message\n")); 
    752             msg_rc(_("| logout . . . . .  exit (if in socket connection)\n")); 
    753             msg_rc(_("| quit . . . . . . . . . . . . . . . . .  quit vlc\n")); 
    754             msg_rc(  "| \n"); 
    755             msg_rc(_("+----[ end of help ]\n")); 
     800 
     801            Help( p_intf, b_longhelp ); 
    756802        } 
    757803        else switch( psz_cmd[0] ) 
     
    791837    } 
    792838 
     839    msg_rc( STATUS_CHANGE "( stop state: 0 )\r\n" ); 
     840    msg_rc( STATUS_CHANGE "( quit )\r\n" ); 
     841 
    793842    if( p_input ) 
    794843    { 
     844        var_DelCallback( p_input, "state", StateChanged, p_intf ); 
     845        var_DelCallback( p_input, "rate-faster", RateChanged, p_intf ); 
     846        var_DelCallback( p_input, "rate-slower", RateChanged, p_intf ); 
     847        var_DelCallback( p_input, "rate", RateChanged, p_intf ); 
     848        var_DelCallback( p_input, "time-offset", TimeOffsetChanged, p_intf ); 
    795849        vlc_object_release( p_input ); 
    796850        p_input = NULL; 
     
    802856        p_playlist = NULL; 
    803857    } 
     858     
     859    var_DelCallback( p_intf->p_vlc, "audio-volume", VolumeChanged, p_intf ); 
    804860} 
    805861 
     862static void Help( intf_thread_t *p_intf, vlc_bool_t b_longhelp) 
     863{                 
     864    msg_rc(_("+----[ Remote control commands ]\n")); 
     865    msg_rc(  "| \n"); 
     866    msg_rc(_("| add XYZ  . . . . . . . . . . add XYZ to playlist\n")); 
     867    msg_rc(_("| playlist . . .  show items currently in playlist\n")); 
     868    msg_rc(_("| play . . . . . . . . . . . . . . . . play stream\n")); 
     869    msg_rc(_("| stop . . . . . . . . . . . . . . . . stop stream\n")); 
     870    msg_rc(_("| next . . . . . . . . . . . .  next playlist item\n")); 
     871    msg_rc(_("| prev . . . . . . . . . .  previous playlist item\n")); 
     872    msg_rc(_("| goto . . . . . . . . . . . .  goto item at index\n")); 
     873    msg_rc(_("| title [X]  . . . . set/get title in current item\n")); 
     874    msg_rc(_("| title_n  . . . . . .  next title in current item\n")); 
     875    msg_rc(_("| title_p  . . . .  previous title in current item\n")); 
     876    msg_rc(_("| chapter [X]  . . set/get chapter in current item\n")); 
     877    msg_rc(_("| chapter_n  . . . .  next chapter in current item\n")); 
     878    msg_rc(_("| chapter_p  . .  previous chapter in current item\n")); 
     879    msg_rc(  "| \n"); 
     880    msg_rc(_("| seek X . seek in seconds, for instance `seek 12'\n")); 
     881    msg_rc(_("| pause  . . . . . . . . . . . . . .  toggle pause\n")); 
     882    msg_rc(_("| fastforward  . . . . . .  .  set to maximum rate\n")); 
     883    msg_rc(_("| rewind  . . . . . . . . . .  set to minimum rate\n")); 
     884    msg_rc(_("| faster . . . . . . . .  faster playing of stream\n")); 
     885    msg_rc(_("| slower . . . . . . . .  slower playing of stream\n")); 
     886    msg_rc(_("| normal . . . . . . . .  normal playing of stream\n")); 
     887    msg_rc(_("| f  . . . . . . . . . . . . . . toggle fullscreen\n")); 
     888    msg_rc(_("| info . . .  information about the current stream\n")); 
     889    msg_rc(  "| \n"); 
     890    msg_rc(_("| volume [X] . . . . . . . .  set/get audio volume\n")); 
     891    msg_rc(_("| volup [X]  . . . . .  raise audio volume X steps\n")); 
     892    msg_rc(_("| voldown [X]  . . . .  lower audio volume X steps\n")); <