Changeset 26e60046898da4294f4686d34fbf499385bbf6d1
- Timestamp:
- 11/08/05 00:08:50 (3 years ago)
- git-parent:
- Files:
-
- Makefile.am (modified) (3 diffs)
- configure.ac (modified) (1 diff)
- include/stream_output.h (modified) (3 diffs)
- include/vlc_common.h (modified) (1 diff)
- include/vlc_objects.h (modified) (1 diff)
- include/vlc_osd.h (added)
- include/vlc_symbols.h (modified) (3 diffs)
- modules/LIST (modified) (1 diff)
- modules/codec/dvbsub.c (modified) (2 diffs)
- modules/control/rc.c (modified) (64 diffs)
- modules/stream_out/transcode.c (modified) (15 diffs)
- modules/video_filter/Modules.am (modified) (1 diff)
- modules/video_filter/osdmenu.c (added)
- src/Makefile.am (modified) (1 diff)
- src/misc/modules.c (modified) (1 diff)
- src/misc/objects.c (modified) (2 diffs)
- src/osd/osd.c (added)
- src/osd/osd_parser.c (added)
- src/osd/osd_widgets.c (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
Makefile.am
r8fea082 r26e6004 113 113 include/vlc_meta.h \ 114 114 include/vlc_objects.h \ 115 include/vlc_osd.h \ 115 116 include/vlc_playlist.h \ 116 117 include/vlc_spu.h \ … … 383 384 src/stream_output/sap.c \ 384 385 src/stream_output/acl.c \ 386 src/osd/osd.c \ 387 src/osd/osd_widgets.c \ 388 src/osd/osd_parser.c \ 385 389 src/misc/charset.c \ 386 390 src/misc/httpd.c \ … … 814 818 done 815 819 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 816 863 mkdir -p "$(top_builddir)/vlc-${VERSION}/http/admin" 817 864 mkdir -p "$(top_builddir)/vlc-${VERSION}/http/vlm" configure.ac
r4d611bb r26e6004 2690 2690 VLC_ADD_LDFLAGS([png],[-lpng -lz]) 2691 2691 VLC_ADD_PLUGINS([png]) 2692 VLC_ADD_PLUGINS([osdmenu]) 2692 2693 AC_DEFINE(HAVE_LIBPNG, [], [Define if you have the PNG library: libpng])], 2693 2694 [],[-lz]) include/stream_output.h
r53d6bb5 r26e6004 2 2 * stream_output.h : stream output module 3 3 ***************************************************************************** 4 * Copyright (C) 2002 the VideoLAN team4 * Copyright (C) 2002-2005 the VideoLAN team 5 5 * $Id$ 6 6 * … … 8 8 * Laurent Aimar <fenrir@via.ecp.fr> 9 9 * Eric Petit <titer@videolan.org> 10 * Jean-Paul Saman <jpsaman #_at_# m2x.nl> 10 11 * 11 12 * This program is free software; you can redistribute it and/or modify … … 207 208 char *psz_next; 208 209 210 /* Subpicture unit */ 211 spu_t *p_spu; 212 209 213 /* add, remove a stream */ 210 214 sout_stream_id_t *(*pf_add)( sout_stream_t *, es_format_t * ); include/vlc_common.h
rd71f0a6 r26e6004 405 405 typedef struct opengl_t opengl_t; 406 406 typedef struct opengl_sys_t opengl_sys_t; 407 408 /* osdmenu */ 409 typedef struct osd_menu_t osd_menu_t; 410 typedef struct osd_state_t osd_state_t; 411 typedef struct osd_event_t osd_event_t; 412 typedef struct osd_button_t osd_button_t; 413 typedef struct osd_menu_state_t osd_menu_state_t; 407 414 408 415 /* VLM */ include/vlc_objects.h
rfe087a3 r26e6004 60 60 #define VLC_OBJECT_SD (-26) 61 61 #define VLC_OBJECT_XML (-27) 62 #define VLC_OBJECT_OSDMENU (-28) 62 63 63 64 #define VLC_OBJECT_GENERIC (-666) include/vlc_symbols.h
r1da4cee r26e6004 392 392 int (*vlc_scandir_inner) (const char *name, struct dirent ***namelist, int (*filter) ( const struct dirent * ), int (*compar) ( const struct dirent **, const struct dirent ** )); 393 393 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 *); 394 410 }; 395 411 # if defined (__PLUGIN__) … … 767 783 # define vlc_scandir (p_symbols)->vlc_scandir_inner 768 784 # 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 769 801 # elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__) 770 802 /****************************************************************** … … 1145 1177 ((p_symbols)->vlc_scandir_inner) = vlc_scandir; \ 1146 1178 ((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; \ 1147 1195 (p_symbols)->net_ConvertIPv4_deprecated = NULL; \ 1148 1196 (p_symbols)->vlc_fix_readdir_charset_deprecated = NULL; \ modules/LIST
r44d19ee r26e6004 343 343 * opie: interface for Opie using QT/Embedded library. 344 344 345 * osdmenu: video_filter for displaying and streaming a On Screen Display menu 346 345 347 * oss: audio output module using the OSS /dev/dsp interface. 346 348 modules/codec/dvbsub.c
r5a896a3 r26e6004 1558 1558 } 1559 1559 1560 /* FIXME: this routine is a hack to convert VLC_FOURCC('Y','U','V','A') 1561 * into VLC_FOURCC('Y','U','V','P') 1562 */ 1563 static 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 1560 1759 /**************************************************************************** 1561 1760 * Encode: the whole thing … … 1563 1762 static block_t *Encode( encoder_t *p_enc, subpicture_t *p_subpic ) 1564 1763 { 1764 subpicture_t *p_temp = NULL; 1765 subpicture_region_t *p_region = NULL; 1565 1766 bs_t bits, *s = &bits; 1566 1767 block_t *p_block; 1567 1768 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 1570 1801 #if DEBUG_DVBSUB 1571 1802 msg_Dbg( p_enc, "encoding subpicture" ); modules/control/rc.c
r17950a1 r26e6004 6 6 * 7 7 * Author: Peter Surda <shurdeek@panorama.sth.ac.at> 8 * Jean-Paul Saman <jpsaman #_at_# m2x _replaceWith#dot_ nl> 8 9 * 9 10 * This program is free software; you can redistribute it and/or modify … … 37 38 #include <vlc/aout.h> 38 39 #include <vlc/vout.h> 40 #include <vlc_osd.h> 39 41 40 42 #ifdef HAVE_UNISTD_H … … 59 61 60 62 #define MAX_LINE_LENGTH 256 63 #define STATUS_CHANGE "status change: " 61 64 62 65 /***************************************************************************** … … 66 69 static void Deactivate ( vlc_object_t * ); 67 70 static void Run ( intf_thread_t * ); 71 72 static void Help ( intf_thread_t *, vlc_bool_t ); 68 73 69 74 static vlc_bool_t ReadCommand( intf_thread_t *, char *, int * ); … … 87 92 static int AudioConfig ( vlc_object_t *, char const *, 88 93 vlc_value_t, vlc_value_t, void * ); 94 static int Menu ( vlc_object_t *, char const *, 95 vlc_value_t, vlc_value_t, void * ); 96 97 /* Status Callbacks */ 98 static int TimeOffsetChanged( vlc_object_t *, char const *, 99 vlc_value_t, vlc_value_t , void * ); 100 static int VolumeChanged ( vlc_object_t *, char const *, 101 vlc_value_t, vlc_value_t, void * ); 102 static int StateChanged ( vlc_object_t *, char const *, 103 vlc_value_t, vlc_value_t, void * ); 104 static int RateChanged ( vlc_object_t *, char const *, 105 vlc_value_t, vlc_value_t, void * ); 89 106 90 107 struct intf_sys_t … … 94 111 char *psz_unix_path; 95 112 113 /* status changes */ 114 vlc_mutex_t status_lock; 115 playlist_status_t i_last_state; 116 96 117 #ifdef WIN32 97 118 HANDLE hConsoleIn; … … 109 130 va_list args; 110 131 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 ); 112 134 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 } 115 139 va_end( args ); 116 140 } … … 171 195 playlist_t *p_playlist; 172 196 char *psz_host, *psz_unix_path; 173 int *pi_socket = NULL;197 int *pi_socket = NULL; 174 198 175 199 #if defined(HAVE_ISATTY) && !defined(WIN32) … … 274 298 p_intf->p_sys->i_socket = -1; 275 299 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 277 303 /* Non-buffered stdout */ 278 304 setvbuf( stdout, (char *)NULL, _IOLBF, 0 ); … … 319 345 free( p_intf->p_sys->psz_unix_path ); 320 346 } 347 vlc_mutex_destroy( &p_intf->p_sys->status_lock ); 321 348 free( p_intf->p_sys ); 322 349 } … … 438 465 var_Create( p_intf, "logo-transparency", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ); 439 466 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 */ 442 473 var_Create( p_intf, "pause", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); 443 474 var_AddCallback( p_intf, "pause", Input, NULL ); … … 461 492 var_Create( p_intf, "rewind", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); 462 493 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 */ 464 502 var_Create( p_intf, "volume", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); 465 503 var_AddCallback( p_intf, "volume", Volume, NULL ); … … 473 511 var_AddCallback( p_intf, "achan", AudioConfig, NULL ); 474 512 513 /* status callbacks */ 514 /* Listen to audio volume updates */ 515 var_AddCallback( p_intf->p_vlc, "audio-volume", VolumeChanged, p_intf ); 516 475 517 #ifdef WIN32 476 518 /* Get the file descriptor of the console input */ … … 515 557 } 516 558 } 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 } 517 573 } 518 574 else if( p_input->b_dead ) 519 575 { 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 ); 520 581 vlc_object_release( p_input ); 521 582 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 ); 522 616 } 523 617 … … 633 727 { 634 728 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 */ 635 755 } 636 756 } … … 678 798 b_longhelp = VLC_TRUE; 679 799 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 ); 756 802 } 757 803 else switch( psz_cmd[0] ) … … 791 837 } 792 838 839 msg_rc( STATUS_CHANGE "( stop state: 0 )\r\n" ); 840 msg_rc( STATUS_CHANGE "( quit )\r\n" ); 841 793 842 if( p_input ) 794 843 { 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 ); 795 849 vlc_object_release( p_input ); 796 850 p_input = NULL; … … 802 856 p_playlist = NULL; 803 857 } 858 859 var_DelCallback( p_intf->p_vlc, "audio-volume", VolumeChanged, p_intf ); 804 860 } 805 861 862 static 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")); <
