Commit 53b978f8 authored by Sam Hocevar's avatar Sam Hocevar

  * ./BUGS: added a list of known bugs. Please add your findings!
  * ./MODULES: added a short description of each module. Maybe we should
    add more details to make this file really useful.
  * ./doc/bugreport-howto.txt: wishful thinking...
  * ./Makefile: added a workaround for the fact that .c files don't depend
    on <videolan/vlc.h>.
  * ./plugins/memcpy/memcpy.c: all memcpy modules are now built from the same
    single file.
  * ./src/interface/main.c: added the --nommx, --no3dnow, --nommxext, --nosse
    and --noaltivec options to vlc.
  * ./configure.in: removed the --disable-mmx option, now useless because
    of the vlc --no* options.
  * ./src/interface/main.c: fixed a crash caused by the memcpy module
    being released too early.
  * ./include/video.h: more vout4 changes, including margin support, more
    FOURCC formats recognized, transparent support of identical or almost
    identical FOURCC formats.
  * ./include/video_output.h: added a vout_Render function to video output
    modules which is to be executed before vout_Display.
  * ./include/common.h: this header is back.
  * ./plugins/chroma/i420_rgb.c: planar YUV 4:2:0 to packed RGB conversion
    functions, mostly taken from vout3's yuv functions, but heavily modified
    to use FAST_MEMCPY and to handle image dimensions which are not multiples
    of 16. Not all functions have been written yet, though.
  * ./plugins/chroma/i420_yuy2.c: planar YUV 4:2:0 to packed YUV conversion
    functions, various targets such as 4:2:2 YUYV, YVYU, UYVY, or 2:1:1 YUYV,
    with accelerated MMX versions.
  * ./plugins/chroma/i422_yuy2.c: same as i420_yuy2.c but takes planar YUV
    4:2:2 pictures in input. With accelerated MMX versions as well. This plugin
    makes it possible to display 4:2:2 files on most video cards without the
    quality loss of 4:2:0 downsampling.
  * ./plugins/filter/*: thanks to the vout_Render function, all filters now
    output their data perfectly in sync.
  * ./plugins/dvdread/Makefile: fix to prevent unnecessary target rebuilds.
  * ./plugins/sdl/vout_sdl.c: support for YV12, UYVY, YUY2 and YVYU overlays.
  * ./plugins/x11/xcommon.c: support for I420, YV12, YUY2 and Y211 overlays.
parent bf7ee74f
List of known vlc bugs
$Id: BUGS,v 1.1 2002/01/04 14:01:33 sam Exp $
Please try to keep this file up to date. Also, grep for FIXME in the
source files for more and more bugs to fix.
For information on how to post a useful bug report, please read
doc/bugreport-howto.txt.
Core:
* vlc_cond_broadcast unimplemented on most plaforms.
* --<moduletype> <module>:<args> doesn't work anymore.
Input:
* There is a memory leak in the input because the input thread is
never joined for termination.
* vlc:foo targets don't work anymore.
Video output:
* We don't render subtitles on RGB surfaces.
* The DirectX video output plugin is broken because of vout4.
* The GGI video output plugin is broken because of vout4.
* The BeOS video output plugin is broken because of vout4.
* The QNX video output plugin is broken because of vout4.
Chroma transformations:
* The only working YUV2RGB transformation function is the MMX version
of the 4:2:0 to RGB16 function.
* Most chroma transformation modules completely ignore margins.
* Most chroma transformation modules restrict the width of a picture
to multiples of 8 or even 16. We can achieve better than that.
Filters:
* Most filters completely ignore margins.
Gtk interface:
* Playing like a madman with the `Playlist' button makes the interface
crash.
* Saving preferences does not work at all.
...@@ -1048,7 +1048,7 @@ Mon, 5 Mar 2001 00:41:16 +0100 ...@@ -1048,7 +1048,7 @@ Mon, 5 Mar 2001 00:41:16 +0100
It will allow to watch some DVD that went through menus by default. It will allow to watch some DVD that went through menus by default.
* Beginning of menus in gnome interface. * Beginning of menus in gnome interface.
* Fix bug in ac3dec for mono streams * Fix bug in ac3dec for mono streams
* BeOS: bew video output method, the vlc now uses BBitmap instead of * BeOS: new video output method, the vlc now uses BBitmap instead of
BDirectWindow (better performances) BDirectWindow (better performances)
* BeOS: added resizing * BeOS: added resizing
* BeOS: added beta support for overlay * BeOS: added beta support for overlay
......
List of vlc plugins
$Id: MODULES,v 1.1 2002/01/04 14:01:34 sam Exp $
* ac3_adec: software AC3 decoder.
* ac3_spdif: AC3 decoder using SPDIF pass-through.
* alsa: audio output module using the ALSA API.
* arts: audio output module using the aRts sound daemon.
* beos: audio output, video output, and interface module for BeOS.
* chroma_i420_rgb: planar YUV to packed RGB conversion functions.
* chroma_i420_rgb_mmx: MMX accelerated version of chroma_i420_rgb.
* chroma_i420_yuy2: planar 4:2:0 YUV to packed YUV conversion functions.
* chroma_i420_yuy2_mmx: MMX accelerated version of chroma_i420_yuy2.
* chroma_i422_yuy2: planar 4:2:2 YUV to packed YUV conversion functions.
* chroma_i422_yuy2_mmx: MMX accelerated version of chroma_i422_yuy2.
* directx: audio output and video output module using the DirectX API.
* dsp: audio output module using the OSS /dev/dsp interface.
* dummy: dummy audio output, video output, interface and input modules.
* null: a module with no capabilities.
* dvd: input module for accessing DVDs.
* dvdread: input module for accessing DVDs, uses libdvdread.
* esd: audio output module using the Esound sound daemon.
* fb: video output module for the Linux framebuffer.
* filter_deinterlace: naive deinterlacing filter.
* filter_transform: filter for horizontal and vertical image flips and
90 rotations.
* filter_invert: inverse video filter.
* filter_distort: miscellaneous image effects filter.
* filter_wall: image wall filter.
* ggi: video output module using the GGI API.
* glide: video output module using the Glide API.
* gnome: interface using the GNOME widget set.
* gtk: interface using the Gtk+ widget set.
* downmix: downmix module, used by the AC3 decoder.
* downmixsse: SSE accelerated version of downmix.
* downmix3dn: 3D Now! accelerated version of downmix.
* idct: inverse DCT module, used by the video decoder.
* idctclassic: another version of idct.
* idctmmx: MMX accelerated version of idct.
* idctmmxext: MMX EXT accelerated version of idct.
* idctaltivec: AltiVec accelerated version of idct.
* imdct: iMDCT module, used by the AC3 decoder.
* imdct3dn: 3D Now! accelerated version of imdct.
* imdctsse: SSE accelerated version of imdct.
* kde: interface module using the KDE widget set.
* lpcm_adec: LPCM audio decoder.
* macosx: audio output, video output and interface module for Mac OS X.
* mad: MPEG and MPEG2 audio decoder using the libmad library.
* memcpy: memory chunk copying module.
* memcpymmx: MMX accelerated version of memcpy.
* memcpymmxext: MMX EXT accelerated version of memcpy.
* memcpy3dn: 3D Now! accelerated version of memcpy.
* mga: video output module for Matrox cards using the Linux mga kernel
driver.
* motion: motion compensation module, used by the video decoder.
* motionmmx: MMX accelerated version of motion.
* motionmmxext: MMX EXT accelerated version of motion.
* motion3dnow: 3D Now! accelerated version of motion.
* motionaltivec: AltiVec accelerated version of motion.
* mpeg_es: input module for MPEG ES decapsulation.
* mpeg_ps: input module for MPEG PS decapsulation.
* mpeg_ts: input module for MPEG TS decapsulation.
* mpeg_adec: MPEG and MPEG2 audio decoder.
* mpeg_vdec: MPEG and MPEG2 video decoder.
* qt: interface module using the Qt widget set.
* sdl: audio output and video output module using the SDL library.
* spudec: DVD subtitles decoder.
* ncurses: interface module using the ncurses library.
* rc: interface module using stdio.
* vcd: input module for accessing Video CDs.
* x11: video output module using the X11 API.
* xvideo: video output module using the XVideo API.
...@@ -55,8 +55,12 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \ ...@@ -55,8 +55,12 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \
alsa/alsa \ alsa/alsa \
arts/arts \ arts/arts \
beos/beos \ beos/beos \
chroma/chroma_yv12_rgb8 \ chroma/chroma_i420_rgb \
chroma/chroma_yv12_rgb16 \ chroma/chroma_i420_rgb_mmx \
chroma/chroma_i420_yuy2 \
chroma/chroma_i420_yuy2_mmx \
chroma/chroma_i422_yuy2 \
chroma/chroma_i422_yuy2_mmx \
directx/directx \ directx/directx \
dsp/dsp \ dsp/dsp \
dummy/dummy \ dummy/dummy \
...@@ -111,9 +115,7 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \ ...@@ -111,9 +115,7 @@ PLUGINS_TARGETS := ac3_adec/ac3_adec \
text/rc \ text/rc \
vcd/vcd \ vcd/vcd \
x11/x11 \ x11/x11 \
x11/xvideo \ x11/xvideo
yuv/yuv \
yuv/yuvmmx
# #
# C Objects # C Objects
...@@ -157,6 +159,24 @@ VLC_OBJ := $(C_OBJ) $(CPP_OBJ) $(BUILTIN_OBJ) $(RESOURCE_OBJ) ...@@ -157,6 +159,24 @@ VLC_OBJ := $(C_OBJ) $(CPP_OBJ) $(BUILTIN_OBJ) $(RESOURCE_OBJ)
# #
H_OBJ := src/misc/modules_builtin.h H_OBJ := src/misc/modules_builtin.h
#
# Included headers which don't get noticed by Makefile.dep
#
H_DEP := videolan/vlc.h \
defs.h \
config.h \
int_types.h \
modules_inner.h \
common.h \
beos_specific.h \
darwin_specific.h \
win32_specific.h \
intf_msg.h \
threads.h \
mtime.h \
modules.h \
main.h
# #
# Other lists of files # Other lists of files
# #
...@@ -526,12 +546,14 @@ $(C_DEP): %.d: FORCE ...@@ -526,12 +546,14 @@ $(C_DEP): %.d: FORCE
$(CPP_DEP): %.dpp: FORCE $(CPP_DEP): %.dpp: FORCE
@$(MAKE) -s --no-print-directory -f Makefile.dep $@ @$(MAKE) -s --no-print-directory -f Makefile.dep $@
$(C_OBJ): %.o: Makefile.opts Makefile.dep Makefile $(H_OBJ) $(C_OBJ): %.o: Makefile.opts Makefile.dep Makefile
$(C_OBJ): %.o: $(H_OBJ) $(H_DEP:%=include/%)
$(C_OBJ): %.o: .dep/%.d $(C_OBJ): %.o: .dep/%.d
$(C_OBJ): %.o: %.c $(C_OBJ): %.o: %.c
$(CC) $(CFLAGS) $(CFLAGS_VLC) -c -o $@ $< $(CC) $(CFLAGS) $(CFLAGS_VLC) -c -o $@ $<
$(CPP_OBJ): %.o: Makefile.opts Makefile.dep Makefile $(CPP_OBJ): %.o: Makefile.opts Makefile.dep Makefile
$(CPP_OBJ): %.o: $(H_OBJ) $(H_DEP:%=include/%)
$(CPP_OBJ): %.o: .dep/%.dpp $(CPP_OBJ): %.o: .dep/%.dpp
$(CPP_OBJ): %.o: %.cpp $(CPP_OBJ): %.o: %.cpp
$(CC) $(CFLAGS) $(CFLAGS_VLC) -c -o $@ $< $(CC) $(CFLAGS) $(CFLAGS_VLC) -c -o $@ $<
......
...@@ -57,6 +57,7 @@ clean: ...@@ -57,6 +57,7 @@ clean:
FORCE: FORCE:
$(OBJ_ALL): ../../Makefile.modules ../../Makefile.dep ../../Makefile Makefile $(OBJ_ALL): ../../Makefile.modules ../../Makefile.dep ../../Makefile Makefile
$(OBJ_ALL): $(H_DEP:%=../../include/%)
$(C_DEP): %.d: FORCE $(C_DEP): %.d: FORCE
@$(MAKE) -s --no-print-directory -f ../../Makefile.dep $@ CFLAGS="$(CFLAGS) $(CFLAGS_EXTRA)" @$(MAKE) -s --no-print-directory -f ../../Makefile.dep $@ CFLAGS="$(CFLAGS) $(CFLAGS_EXTRA)"
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -252,7 +252,7 @@ dnl Checks for __attribute__(aligned()) directive ...@@ -252,7 +252,7 @@ dnl Checks for __attribute__(aligned()) directive
AC_CACHE_CHECK([__attribute__ ((aligned ())) support], AC_CACHE_CHECK([__attribute__ ((aligned ())) support],
[ac_cv_c_attribute_aligned], [ac_cv_c_attribute_aligned],
[ac_cv_c_attribute_aligned=0 [ac_cv_c_attribute_aligned=0
CFLAGS="${save_CFLAGS} -Werror" CFLAGS="${save_CFLAGS} -Werror"
for ac_cv_c_attr_align_try in 2 4 8 16 32 64; do for ac_cv_c_attr_align_try in 2 4 8 16 32 64; do
AC_TRY_COMPILE([], AC_TRY_COMPILE([],
[static char c __attribute__ ((aligned($ac_cv_c_attr_align_try))) = 0; return c;], [static char c __attribute__ ((aligned($ac_cv_c_attr_align_try))) = 0; return c;],
...@@ -297,13 +297,13 @@ ARCH=${target_cpu} ...@@ -297,13 +297,13 @@ ARCH=${target_cpu}
dnl dnl
dnl default modules dnl default modules
dnl dnl
BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy idct idctclassic motion imdct downmix mpeg_adec lpcm_adec ac3_adec mpeg_vdec" BUILTINS="${BUILTINS} mpeg_es mpeg_ps mpeg_ts memcpy idct idctclassic motion imdct downmix chroma_i420_rgb chroma_i420_yuy2 chroma_i422_yuy2 mpeg_adec lpcm_adec ac3_adec mpeg_vdec"
PLUGINS="${PLUGINS} ac3_spdif spudec chroma_yv12_rgb16 filter_deinterlace filter_invert filter_wall filter_transform filter_distort" PLUGINS="${PLUGINS} ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort"
dnl dnl
dnl Accelerated modules dnl Accelerated modules
dnl dnl
MMX_MODULES="memcpymmx idctmmx motionmmx" MMX_MODULES="memcpymmx idctmmx motionmmx chroma_i420_rgb_mmx chroma_i420_yuy2_mmx chroma_i422_yuy2_mmx"
MMXEXT_MODULES="memcpymmxext idctmmxext motionmmxext" MMXEXT_MODULES="memcpymmxext idctmmxext motionmmxext"
THREEDNOW_MODULES="memcpy3dn imdct3dn downmix3dn" THREEDNOW_MODULES="memcpy3dn imdct3dn downmix3dn"
SSE_MODULES="imdctsse downmixsse" SSE_MODULES="imdctsse downmixsse"
...@@ -576,14 +576,13 @@ AC_ARG_ENABLE(release, ...@@ -576,14 +576,13 @@ AC_ARG_ENABLE(release,
LIBDVDCSS_VERSION="${LIBDVDCSS_VERSION}_`date +%Y-%m-%d`"; ]) LIBDVDCSS_VERSION="${LIBDVDCSS_VERSION}_`date +%Y-%m-%d`"; ])
dnl dnl
dnl MMX acceleration dnl x86 accelerations
dnl dnl
AC_ARG_ENABLE(mmx, if test x${target_cpu} = xi686 -o x${target_cpu} = xi586 -o x${target_cpu} = xx86 -o x${target_cpu} = xi386
[ --disable-mmx Disable MMX optimizations (default enabled for x86)], then
[ if test x$enableval = xyes; then ARCH="${ARCH} mmx"; ARCH="${ARCH} mmx"
BUILTINS="${BUILTINS} ${ACCEL_MODULES}"; fi ], BUILTINS="${BUILTINS} ${ACCEL_MODULES}"
[ if test x${target_cpu} = xi686 -o x${target_cpu} = xi586 -o x${target_cpu} = xx86 -o x${target_cpu} = xi386; then ARCH="${ARCH} mmx"; fi
BUILTINS="${BUILTINS} ${ACCEL_MODULES}"; fi ])
dnl dnl
dnl AltiVec acceleration dnl AltiVec acceleration
...@@ -808,7 +807,7 @@ AC_ARG_WITH(mad, ...@@ -808,7 +807,7 @@ AC_ARG_WITH(mad,
[ --with-mad[=PATH] libmad module (default disabled)], [ --with-mad[=PATH] libmad module (default disabled)],
[ if test "x$with_val" != "xno"; then [ if test "x$with_val" != "xno"; then
if test -n $with_val; then if test -n $with_val; then
CFLAGS_MAD="-I$with_val/include" CFLAGS_MAD="-I$with_val/include"
LIB_MAD="-L$with_val/lib -lmad" LIB_MAD="-L$with_val/lib -lmad"
else else
LIB_MAD="-lmad" LIB_MAD="-lmad"
......
Bug report HOWTO
- - - - - - - - - -
* General rules
- Be sure the problem you are reporting is not already known, or
maybe even already solved. Source of information include the BUGS
file, the mailing-list archives at http://www.via.ecp.fr/ml/videolan/
and your old friend Google.
- Be sure to be using a recent version. Bug reports against old
versions of vlc are likely to be ignored, because changes in the
program may make it impossible to reproduce the bug, or may even have
fixed it.
- Give as many details as possible about your problem! Better too
much than not enough.
- Don't forget to say which version of vlc you are using (0.2.91,
CVS snapshot from 21 Dec 2001, Debian packages 0.2.92-4). It is
important to tell us where you got the packages from (web site, CVS,
distribution).
- Also, your platform is very important. vlc runs on a lot of
different operating systems, so you should at least provide your
operating system name and version (Windows 98, Debian Linux woody,
BeOS, ...) and your CPU (Pentium 3, Sparc, PowerPC, ...).
* Reporting a ./configure or make issue
- Give the full log showing the problem:
./configure <options> > logfile.txt 2>&1
make 2>&1 > logfile.txt 2>&1
- When dealing with a ./configure issue, please provide the generated
config.log file.
- Your compiler brand and version may be relevant here as well.
* Reporting a crash
- Try to reproduce the crash and to explain how you reproduced it.
- A gdb backtrace can be useful. For it to have any meaning, vlc
should have been compiled with debug symbols (add the --enable-debug
flag to ./configure)
* Where to send bug reports?
- The vlc-devel mailing-list is probably the best place to send your
bug report, just email it to <vlc-devel@videolan.org>. If you are
concerned by the size of the attached files, you can put them on a
website and post their address instead.
...@@ -172,6 +172,10 @@ Select the CSS decryption verbosity level, 0, 1 or 2. ...@@ -172,6 +172,10 @@ Select the CSS decryption verbosity level, 0, 1 or 2.
.B \-\-input <method> .B \-\-input <method>
Choose the input method, "dvd", "ps", "ts" for instance. Choose the input method, "dvd", "ps", "ts" for instance.
.TP .TP
.B \-\-nommx, \-\-no3dnow, \-\-nommxext, \-\-nosse, \-\-noaltivec
Disable the CPU's MMX, 3D Now!, MMX EXT, SSE or AltiVec support. This may
be useful when you suspect a bug in an accelerated module.
.TP
.B \-h, \-\-help .B \-h, \-\-help
Print help and exit. Print help and exit.
.TP .TP
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* css.c: Functions for DVD authentification and unscrambling * css.c: Functions for DVD authentification and unscrambling
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: css.c,v 1.18 2001/12/30 07:09:54 sam Exp $ * $Id: css.c,v 1.19 2002/01/04 14:01:34 sam Exp $
* *
* Author: Stphane Borel <stef@via.ecp.fr> * Author: Stphane Borel <stef@via.ecp.fr>
* Hkan Hjort <d95hjort@dtek.chalmers.se> * Hkan Hjort <d95hjort@dtek.chalmers.se>
...@@ -325,7 +325,7 @@ int CSSGetDiscKey( dvdcss_handle dvdcss ) ...@@ -325,7 +325,7 @@ int CSSGetDiscKey( dvdcss_handle dvdcss )
} while( ( playerkeys[i].i_offset != -1 ) && } while( ( playerkeys[i].i_offset != -1 ) &&
( memcmp( test_key, disc_key, KEY_SIZE ) ) ); ( memcmp( test_key, disc_key, KEY_SIZE ) ) );
/* The decrypted disk key will replace the disk key hash */ /* The decrypted disk key will replace the disk key hash */
memcpy( dvdcss->css.disc.p_disc_key, disc_key, KEY_SIZE ); memcpy( dvdcss->css.disc.p_disc_key, disc_key, KEY_SIZE );
break; break;
#else #else
......
This diff is collapsed.
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
/* When a thread waits on a condition in debug mode, delay to wait before /* When a thread waits on a condition in debug mode, delay to wait before
* outputting an error message (in second) */ * outputting an error message (in second) */
#define THREAD_COND_TIMEOUT 5 #define THREAD_COND_TIMEOUT 5
/* Environment variable containing the memcpy method */ /* Environment variable containing the memcpy method */
#define MEMCPY_METHOD_VAR "vlc_memcpy" #define MEMCPY_METHOD_VAR "vlc_memcpy"
...@@ -286,7 +286,7 @@ ...@@ -286,7 +286,7 @@
*****************************************************************************/ *****************************************************************************/
/* Maximum number of video output threads */ /* Maximum number of video output threads */
#define VOUT_MAX_THREADS 10 #define VOUT_MAX_THREADS 256
/* /*
* Default settings for video output threads * Default settings for video output threads
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* modules.h : Module management functions. * modules.h : Module management functions.
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: modules.h,v 1.38 2001/12/30 07:09:54 sam Exp $ * $Id: modules.h,v 1.39 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -169,15 +169,20 @@ typedef struct memcpy_module_s ...@@ -169,15 +169,20 @@ typedef struct memcpy_module_s
} memcpy_module_t; } memcpy_module_t;
/* FIXME: not yet used */
typedef struct probedata_s typedef struct probedata_s
{ {
u8 i_type; u8 i_type;
struct struct
{ {
char * psz_data; char * psz_data;
} aout; } aout;
struct
{
u32 i_chroma;
} vout;
struct struct
{ {
struct picture_heap_s* p_output; struct picture_heap_s* p_output;
...@@ -251,6 +256,8 @@ typedef struct function_list_s ...@@ -251,6 +256,8 @@ typedef struct function_list_s
void ( * pf_end ) ( struct vout_thread_s * ); void ( * pf_end ) ( struct vout_thread_s * );
void ( * pf_destroy ) ( struct vout_thread_s * ); void ( * pf_destroy ) ( struct vout_thread_s * );
int ( * pf_manage ) ( struct vout_thread_s * ); int ( * pf_manage ) ( struct vout_thread_s * );
void ( * pf_render ) ( struct vout_thread_s *,
struct picture_s * );
void ( * pf_display ) ( struct vout_thread_s *, void ( * pf_display ) ( struct vout_thread_s *,
struct picture_s * ); struct picture_s * );
void ( * pf_setpalette ) ( struct vout_thread_s *, void ( * pf_setpalette ) ( struct vout_thread_s *,
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* This header provides a portable threads implementation. * This header provides a portable threads implementation.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: threads.h,v 1.33 2001/12/30 07:09:54 sam Exp $ * $Id: threads.h,v 1.34 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@via.ecp.fr> * Samuel Hocevar <sam@via.ecp.fr>
...@@ -484,9 +484,9 @@ static __inline__ int vlc_cond_init( vlc_cond_t *p_condvar ) ...@@ -484,9 +484,9 @@ static __inline__ int vlc_cond_init( vlc_cond_t *p_condvar )
/* Create an auto-reset event. */ /* Create an auto-reset event. */
p_condvar->signal = CreateEvent( NULL, /* no security */ p_condvar->signal = CreateEvent( NULL, /* no security */
FALSE, /* auto-reset event */ FALSE, /* auto-reset event */
FALSE, /* non-signaled initially */ FALSE, /* non-signaled initially */
NULL ); /* unnamed */ NULL ); /* unnamed */
return( !p_condvar->signal ); return( !p_condvar->signal );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vdec_ext-plugins.h : structures from the video decoder exported to plug-ins * vdec_ext-plugins.h : structures from the video decoder exported to plug-ins
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: vdec_ext-plugins.h,v 1.8 2001/12/09 17:01:35 sam Exp $ * $Id: vdec_ext-plugins.h,v 1.9 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -63,7 +63,7 @@ typedef struct macroblock_s ...@@ -63,7 +63,7 @@ typedef struct macroblock_s
/* Motion compensation information */ /* Motion compensation information */
motion_inner_t p_motions[8]; motion_inner_t p_motions[8];
int i_nb_motions; int i_nb_motions;
pixel_data_t * pp_dest[3]; yuv_data_t * pp_dest[3];
} macroblock_t; } macroblock_t;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* includes all common video types and constants. * includes all common video types and constants.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: video.h,v 1.38 2002/01/02 14:37:42 sam Exp $ * $Id: video.h,v 1.39 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -26,15 +26,23 @@ ...@@ -26,15 +26,23 @@
/***************************************************************************** /*****************************************************************************
* plane_t: description of a planar graphic field * plane_t: description of a planar graphic field
*****************************************************************************/ *****************************************************************************/
typedef u8 pixel_data_t;
typedef struct plane_s typedef struct plane_s
{ {
pixel_data_t *p_data; /* Start of the plane's data */ u8 *p_pixels; /* Start of the plane's data */
/* Variables used for fast memcpy operations */ /* Variables used for fast memcpy operations */
int i_bytes; /* Total number of bytes in the plane */ int i_lines; /* Number of lines */
int i_line_bytes; /* Total number of bytes in a line */ int i_pitch; /* Number of bytes in a line, including margins */
/* Size of a macropixel, defaults to 1 */
int i_pixel_bytes;
/* Is there a margin ? defaults to no */
boolean_t b_margin;
/* Variables used for pictures with margins */
int i_visible_bytes; /* How many real pixels are there ? */
boolean_t b_hidden; /* Are we allowed to write to the margin ? */
/* Variables used for RGB planes */ /* Variables used for RGB planes */
int i_red_mask; int i_red_mask;
...@@ -53,11 +61,11 @@ typedef struct plane_s ...@@ -53,11 +61,11 @@ typedef struct plane_s
*****************************************************************************/ *****************************************************************************/
typedef struct picture_s typedef struct picture_s
{ {
/* Picture data - data can always be freely modified, but no pointer /* Picture data - data can always be freely modified, but p_data may
* may EVER be modified. A direct buffer can be handled as the plugin * NEVER be modified. A direct buffer can be handled as the plugin
* wishes, but for internal video output pictures the allocated pointer * wishes, it can even swap p_pixels buffers. */
* MUST be planes[0].p_data */ u8 *p_data;
plane_t planes[ VOUT_MAX_PLANES ]; /* description of the planes */ plane_t p[ VOUT_MAX_PLANES ]; /* description of the planes */
int i_planes; /* number of allocated planes */ int i_planes; /* number of allocated planes */
/* Type and flags - should NOT be modified except by the vout thread */ /* Type and flags - should NOT be modified except by the vout thread */
...@@ -70,12 +78,6 @@ typedef struct picture_s ...@@ -70,12 +78,6 @@ typedef struct picture_s
int i_refcount; /* link reference counter */ int i_refcount; /* link reference counter */
mtime_t date; /* display date */ mtime_t date; /* display date */
/* Picture margins - needed because of possible padding issues */
int i_left_margin;
int i_right_margin;
int i_top_margin;
int i_bottom_margin;
/* Picture dynamic properties - those properties can be changed by the /* Picture dynamic properties - those properties can be changed by the
* decoder */ * decoder */
boolean_t b_progressive; /* is it a progressive frame ? */ boolean_t b_progressive; /* is it a progressive frame ? */
...@@ -105,7 +107,7 @@ typedef struct picture_heap_s ...@@ -105,7 +107,7 @@ typedef struct picture_heap_s
* and should NOT be modified */ * and should NOT be modified */
int i_width; /* picture width */ int i_width; /* picture width */
int i_height; /* picture height */ int i_height; /* picture height */
u64 i_chroma; /* picture chroma */ u32 i_chroma; /* picture chroma */
int i_aspect; /* aspect ratio */ int i_aspect; /* aspect ratio */
/* Real pictures */ /* Real pictures */
...@@ -132,47 +134,103 @@ typedef struct picture_heap_s ...@@ -132,47 +134,103 @@ typedef struct picture_heap_s
#define DESTROYED_PICTURE 6 /* allocated but no more used */ #define DESTROYED_PICTURE 6 /* allocated but no more used */
/***************************************************************************** /*****************************************************************************
* Flags used to describe the format of a picture * Flags used to describe picture format - see http://www.webartz.com/fourcc/
*****************************************************************************/ *****************************************************************************/
#define ONLY_FOURCC(i_chroma) ((i_chroma)&0x00000000ffffffff) /* Packed RGB formats */
#define ONLY_EXTRA(i_chroma) ((i_chroma)&0xffffffff00000000) #define FOURCC_BI_RGB 0x00000000 /* RGB for 8bpp */
#define FOURCC_RGB 0x32424752 /* alias for BI_RGB */
/* Picture chroma - see http://www.webartz.com/fourcc/ */ #define FOURCC_BI_BITFIELDS 0x00000003 /* RGB, for 16, 24, 32bpp */
#define FOURCC_BI_RGB 0x00000000 /* Planar RGB, for 8bpp */ #define FOURCC_RV15 0x35315652 /* RGB 15bpp, 0x1f, 0x7e0, 0xf800 */
#define FOURCC_RGB 0x32424752 /* alias for BI_RGB */ #define FOURCC_RV16 0x36315652 /* RGB 16bpp, 0x1f, 0x3e0, 0x7c00 */
#define FOURCC_BI_BITFIELDS 0x00000003 /* Planar RGB, for 16, 24, 32bpp */
#define FOURCC_I420 0x30323449 /* Planar 4:2:0, Y:U:V */ /* Planar YUV formats */
#define FOURCC_IYUV 0x56555949 /* alias for I420 */ #define FOURCC_I420 0x30323449 /* Planar 4:2:0, Y:U:V */
#define FOURCC_YV12 0x32315659 /* Planar 4:2:0, Y:V:U */ #define FOURCC_IYUV 0x56555949 /* alias for I420 */
#define FOURCC_YV12 0x32315659 /* Planar 4:2:0, Y:V:U */
/* Packed YUV formats */
#define FOURCC_IUYV 0x56595549 /* Packed 4:2:2, U:Y:V:Y, interlaced */
#define FOURCC_UYVY 0x59565955 /* Packed 4:2:2, U:Y:V:Y */
#define FOURCC_UYNV 0x564e5955 /* alias for UYVY */
#define FOURCC_Y422 0x32323459 /* alias for UYVY */
#define FOURCC_cyuv 0x76757963 /* Packed 4:2:2, U:Y:V:Y, reverted */
#define FOURCC_YUY2 0x32595559 /* Packed 4:2:2, Y:U:Y:V */
#define FOURCC_YUNV 0x564e5559 /* alias for YUY2 */
#define FOURCC_YVYU 0x55585659 /* Packed 4:2:2, Y:V:Y:U */
#define FOURCC_Y211 0x31313259 /* Packed 2:1:1, Y:U:Y:V */
/* Custom formats which we use but which don't exist in the fourcc database */ /* Custom formats which we use but which don't exist in the fourcc database */
#define FOURCC_I422 0x32323449 #define FOURCC_I422 0x32323449 /* Planar 4:2:2, Y:U:V */
#define FOURCC_I444 0x34343449 #define FOURCC_I444 0x34343449 /* Planar 4:4:4, Y:U:V */
/* Picture format - gives more precise information than the chroma */
#define DEPTH_8BPP ((u64)0x00000008<<32)
#define DEPTH_15BPP ((u64)0x00000015<<32)
#define DEPTH_16BPP ((u64)0x00000016<<32)
#define DEPTH_24BPP ((u64)0x00000024<<32)
#define DEPTH_32BPP ((u64)0x00000032<<32)
/* Plane indices */ /* Plane indices */
#define MAIN_PLANE 0 #define Y_PLANE 0
#define Y_PLANE 0 #define U_PLANE 1
#define U_PLANE 1 #define V_PLANE 2
#define V_PLANE 2
#define Cb_PLANE 1
#define Cr_PLANE 2
#define R_PLANE 0
#define G_PLANE 1
#define B_PLANE 2
/* Shortcuts */ /* Shortcuts */
#define P_MAIN planes[ MAIN_PLANE ].p_data #define Y_PIXELS p[Y_PLANE].p_pixels
#define P_Y planes[ Y_PLANE ].p_data #define U_PIXELS p[U_PLANE].p_pixels
#define P_U planes[ U_PLANE ].p_data #define V_PIXELS p[V_PLANE].p_pixels
#define P_V planes[ V_PLANE ].p_data
/*****************************************************************************
* vout_CopyPicture: copy a picture to another one
*****************************************************************************
* This function takes advantage of the image format, and reduces the
* number of calls to memcpy() to the minimum. Source and destination
* images must have same width, height, and chroma.
*****************************************************************************/
static __inline__ void vout_CopyPicture( picture_t *p_src, picture_t *p_dest )
{
int i;
for( i = 0; i < p_src->i_planes ; i++ )
{
if( p_src->p[i].i_pitch == p_dest->p[i].i_pitch )
{
if( p_src->p[i].b_margin )
{
/* If p_src->b_margin is set, p_dest->b_margin must be set */
if( p_dest->p[i].b_hidden )
{
/* There are margins, but they are hidden : perfect ! */
FAST_MEMCPY( p_dest->p[i].p_pixels, p_src->p[i].p_pixels,
p_src->p[i].i_pitch * p_src->p[i].i_lines );
continue;
}
else
{
/* We can't directly copy the margin. Too bad. */
}
}
else
{
/* Same pitch, no margins : perfect ! */
FAST_MEMCPY( p_dest->p[i].p_pixels, p_src->p[i].p_pixels,
p_src->p[i].i_pitch * p_src->p[i].i_lines );
continue;
}
}
else
{
/* Pitch values are different */
}
/* We need to proceed line by line */
{
u8 *p_in = p_src->p[i].p_pixels, *p_out = p_dest->p[i].p_pixels;
int i_line;
for( i_line = p_src->p[i].i_lines; i_line--; )
{
FAST_MEMCPY( p_out, p_in, p_src->p[i].i_visible_bytes );
p_in += p_src->p[i].i_pitch;
p_out += p_dest->p[i].i_pitch;
}
}
}
}
/***************************************************************************** /*****************************************************************************
* subpicture_t: video subtitle * subpicture_t: video subtitle
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
* video_output.h : video output thread * video_output.h : video output thread
* This module describes the programming interface for video output threads. * This module describes the programming interface for video output threads.
* It includes functions allowing to open a new thread, send pictures to a * It includes functions allowing to open a new thread, send pictures to a
* thread, and destroy a previously oppenned video output thread. * thread, and destroy a previously opened video output thread.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: video_output.h,v 1.69 2002/01/02 14:37:42 sam Exp $ * $Id: video_output.h,v 1.70 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -128,6 +128,8 @@ typedef struct vout_thread_s ...@@ -128,6 +128,8 @@ typedef struct vout_thread_s
void ( *pf_end ) ( struct vout_thread_s * ); void ( *pf_end ) ( struct vout_thread_s * );
void ( *pf_destroy ) ( struct vout_thread_s * ); void ( *pf_destroy ) ( struct vout_thread_s * );
int ( *pf_manage ) ( struct vout_thread_s * ); int ( *pf_manage ) ( struct vout_thread_s * );
void ( *pf_render ) ( struct vout_thread_s *,
struct picture_s * );
void ( *pf_display ) ( struct vout_thread_s *, void ( *pf_display ) ( struct vout_thread_s *,
struct picture_s * ); struct picture_s * );
void ( *pf_setpalette ) ( struct vout_thread_s *, void ( *pf_setpalette ) ( struct vout_thread_s *,
...@@ -191,7 +193,7 @@ typedef struct vout_thread_s ...@@ -191,7 +193,7 @@ typedef struct vout_thread_s
void vout_InitBank ( void ); void vout_InitBank ( void );
void vout_EndBank ( void ); void vout_EndBank ( void );
vout_thread_t * vout_CreateThread ( int *pi_status, int, int, u64, int ); vout_thread_t * vout_CreateThread ( int *pi_status, int, int, u32, int );
void vout_DestroyThread ( vout_thread_t *, int *pi_status ); void vout_DestroyThread ( vout_thread_t *, int *pi_status );
vout_fifo_t * vout_CreateFifo ( void ); vout_fifo_t * vout_CreateFifo ( void );
...@@ -200,7 +202,7 @@ void vout_FreeFifo ( vout_fifo_t * ); ...@@ -200,7 +202,7 @@ void vout_FreeFifo ( vout_fifo_t * );
picture_t * vout_CreatePicture ( vout_thread_t *, picture_t * vout_CreatePicture ( vout_thread_t *,
boolean_t, boolean_t, boolean_t ); boolean_t, boolean_t, boolean_t );
void vout_AllocatePicture( picture_t *, int, int, int ); void vout_AllocatePicture( picture_t *, int, int, u32 );
void vout_DestroyPicture ( vout_thread_t *, picture_t * ); void vout_DestroyPicture ( vout_thread_t *, picture_t * );
void vout_DisplayPicture ( vout_thread_t *, picture_t * ); void vout_DisplayPicture ( vout_thread_t *, picture_t * );
void vout_DatePicture ( vout_thread_t *, picture_t *, mtime_t ); void vout_DatePicture ( vout_thread_t *, picture_t *, mtime_t );
......
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* MsgVals.h * MsgVals.h
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: MsgVals.h,v 1.7 2001/10/29 11:07:09 tcastley Exp $ * $Id: MsgVals.h,v 1.8 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Tony Castley <tcastley@mail.powerup.com.au> * Authors: Tony Castley <tcastley@mail.powerup.com.au>
* *
...@@ -35,7 +35,7 @@ const uint32 FASTER_PLAY = 'FAPL'; ...@@ -35,7 +35,7 @@ const uint32 FASTER_PLAY = 'FAPL';
const uint32 SLOWER_PLAY = 'SLPL'; const uint32 SLOWER_PLAY = 'SLPL';
const uint32 SEEK_PLAYBACK = 'SEEK'; const uint32 SEEK_PLAYBACK = 'SEEK';
const uint32 VOLUME_CHG = 'VOCH'; const uint32 VOLUME_CHG = 'VOCH';
const uint32 VOLUME_MUTE = 'MUTE'; const uint32 VOLUME_MUTE = 'MUTE';
const uint32 SELECT_CHANNEL = 'CHAN'; const uint32 SELECT_CHANNEL = 'CHAN';
const uint32 SELECT_SUBTITLE = 'SUBT'; const uint32 SELECT_SUBTITLE = 'SUBT';
const uint32 PREV_TITLE = 'PRTI'; const uint32 PREV_TITLE = 'PRTI';
......
chroma_yv12_rgb8_SOURCES = yv12_rgb8.c chroma_i420_rgb_SOURCES = i420_rgb.c i420_rgb8.c i420_rgb16.c
chroma_yv12_rgb16_SOURCES = yv12_rgb16.c chroma_i420_rgb_mmx_SOURCES = i420_rgb.c i420_rgb16.c
chroma_i420_yuy2_SOURCES = i420_yuy2.c
chroma_i420_yuy2_mmx_SOURCES = i420_yuy2.c
chroma_i422_yuy2_SOURCES = i422_yuy2.c
chroma_i422_yuy2_mmx_SOURCES = i422_yuy2.c
This diff is collapsed.
/*****************************************************************************
* i420_rgb16.c : YUV to bitmap RGB conversion module for vlc
*****************************************************************************
* Copyright (C) 2000 VideoLAN
* $Id: i420_rgb16.c,v 1.1 2002/01/04 14:01:34 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <math.h> /* exp(), pow() */
#include <errno.h> /* ENOMEM */
#include <string.h> /* strerror() */
#include <stdlib.h> /* malloc(), free() */
#include <videolan/vlc.h>
#include "video.h"
#include "video_output.h"
#include "i420_rgb.h"
#if defined (MODULE_NAME_IS_chroma_i420_rgb)
# include "i420_rgb_c.h"
#elif defined (MODULE_NAME_IS_chroma_i420_rgb_mmx)
# include "i420_rgb_mmx.h"
#endif
static void SetOffset( int, int, int, int, boolean_t *, int *, int * );
/*****************************************************************************
* I420_RGB16: color YUV 4:2:0 to RGB 16 bpp
*****************************************************************************
* Horizontal alignment needed:
* - input: 8 pixels (8 Y bytes, 4 U/V bytes), margins not allowed
* - output: 1 pixel (2 bytes), margins allowed
* Vertical alignment needed:
* - input: 2 lines (2 Y lines, 1 U/V line)
* - output: 1 line
*****************************************************************************/
void _M( I420_RGB16 )( vout_thread_t *p_vout, picture_t *p_src,
picture_t *p_dest )
{
/* We got this one from the old arguments */
u16 *p_pic = (u16*)p_dest->p->p_pixels;
u8 *p_y = p_src->Y_PIXELS;
u8 *p_u = p_src->U_PIXELS;
u8 *p_v = p_src->V_PIXELS;
boolean_t b_hscale; /* horizontal scaling type */
int i_vscale; /* vertical scaling type */
int i_x, i_y; /* horizontal and vertical indexes */
int i_right_margin;
int i_rewind;
int i_scale_count; /* scale modulo counter */
int i_chroma_width = p_vout->render.i_width / 2; /* chroma width */
u16 * p_pic_start; /* beginning of the current line for copy */
/* Conversion buffer pointer */
u16 * p_buffer_start = (u16*)p_vout->chroma.p_sys->p_buffer;
u16 * p_buffer;
/* Offset array pointer */
int * p_offset_start = p_vout->chroma.p_sys->p_offset;
int * p_offset;
if( p_dest->p->b_margin )
{
i_right_margin = (p_dest->p->i_pitch - p_dest->p->i_visible_bytes) / 2;
}
else
{
i_right_margin = 0;
}
if( p_vout->render.i_width & 7 )
{
i_rewind = 8 - ( p_vout->render.i_width & 7 );
}
else
{
i_rewind = 0;
}
/* Rule: when a picture of size (x1,y1) with aspect ratio r1 is rendered
* on a picture of size (x2,y2) with aspect ratio r2, if x1 grows to x1'
* then y1 grows to y1' = x1' * y2/x2 * r2/r1 */
SetOffset( p_vout->render.i_width, p_vout->render.i_height,
p_vout->output.i_width, p_vout->output.i_height,
&b_hscale, &i_vscale, p_offset_start );
#if defined (MODULE_NAME_IS_chroma_i420_rgb)
intf_ErrMsg( "vout error: I420_RGB16 unimplemented, "
"please harass sam@zoy.org" );
#endif
/*
* Perform conversion
*/
i_scale_count = ( i_vscale == 1 ) ?
p_vout->output.i_height : p_vout->render.i_height;
for( i_y = 0; i_y < p_vout->render.i_height; i_y++ )
{
p_pic_start = p_pic;
p_buffer = b_hscale ? p_buffer_start : p_pic;
for ( i_x = p_vout->render.i_width / 8; i_x--; )
{
#if defined (MODULE_NAME_IS_chroma_i420_rgb)
/* FIXME: TODO */
#elif defined (MODULE_NAME_IS_chroma_i420_rgb_mmx)
__asm__( MMX_INIT_16
: : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) );
__asm__( ".align 8"
MMX_YUV_MUL
MMX_YUV_ADD
MMX_UNPACK_16
: : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) );
p_y += 8;
p_u += 4;
p_v += 4;
p_buffer += 8;
#endif
}
/* Here we do some unaligned reads and duplicate conversions, but
* at least we have all the pixels */
if( i_rewind )
{
p_y -= i_rewind;
p_u -= i_rewind >> 1;
p_v -= i_rewind >> 1;
p_buffer -= i_rewind;
#if defined (MODULE_NAME_IS_chroma_i420_rgb)
/* FIXME: TODO */
#elif defined (MODULE_NAME_IS_chroma_i420_rgb_mmx)
__asm__( MMX_INIT_16
: : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) );
__asm__( ".align 8"
MMX_YUV_MUL
MMX_YUV_ADD
MMX_UNPACK_16
: : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) );
p_y += 8;
p_u += 4;
p_v += 4;
p_buffer += 8;
#endif
}
SCALE_WIDTH;
SCALE_HEIGHT( 420, 2 );
}
}
/*****************************************************************************
* I420_RGB24: color YUV 4:2:0 to RGB 24 bpp
*****************************************************************************/
void _M( I420_RGB24 )( vout_thread_t *p_vout, picture_t *p_src,
picture_t *p_dest )
{
intf_ErrMsg( "vout error: I420_RGB24 unimplemented, "
"please harass sam@zoy.org" );
}
/*****************************************************************************
* I420_RGB32: color YUV 4:2:0 to RGB 32 bpp
*****************************************************************************/
void _M( I420_RGB32 )( vout_thread_t *p_vout, picture_t *p_src,
picture_t *p_dest )
{
intf_ErrMsg( "vout error: I420_RGB32 unimplemented, "
"please harass sam@zoy.org" );
}
/* Following functions are local */
/*****************************************************************************
* SetOffset: build offset array for conversion functions
*****************************************************************************
* This function will build an offset array used in later conversion functions.
* It will also set horizontal and vertical scaling indicators.
*****************************************************************************/
static void SetOffset( int i_width, int i_height, int i_pic_width,
int i_pic_height, boolean_t *pb_hscale,
int *pi_vscale, int *p_offset )
{
int i_x; /* x position in destination */
int i_scale_count; /* modulo counter */
/*
* Prepare horizontal offset array
*/
if( i_pic_width - i_width == 0 )
{
/* No horizontal scaling: YUV conversion is done directly to picture */
*pb_hscale = 0;
}
else if( i_pic_width - i_width > 0 )
{
/* Prepare scaling array for horizontal extension */
*pb_hscale = 1;
i_scale_count = i_pic_width;
for( i_x = i_width; i_x--; )
{
while( (i_scale_count -= i_width) > 0 )
{
*p_offset++ = 0;
}
*p_offset++ = 1;
i_scale_count += i_pic_width;
}
}
else /* if( i_pic_width - i_width < 0 ) */
{
/* Prepare scaling array for horizontal reduction */
*pb_hscale = 1;
i_scale_count = i_width;
for( i_x = i_pic_width; i_x--; )
{
*p_offset = 1;
while( (i_scale_count -= i_pic_width) > 0 )
{
*p_offset += 1;
}
p_offset++;
i_scale_count += i_width;
}
}
/*
* Set vertical scaling indicator
*/
if( i_pic_height - i_height == 0 )
{
*pi_vscale = 0;
}
else if( i_pic_height - i_height > 0 )
{
*pi_vscale = 1;
}
else /* if( i_pic_height - i_height < 0 ) */
{
*pi_vscale = -1;
}
}
/*****************************************************************************
* i420_rgb8.c : YUV to bitmap RGB conversion module for vlc
*****************************************************************************
* Copyright (C) 2000 VideoLAN
* $Id: i420_rgb8.c,v 1.1 2002/01/04 14:01:34 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <math.h> /* exp(), pow() */
#include <errno.h> /* ENOMEM */
#include <string.h> /* strerror() */
#include <stdlib.h> /* malloc(), free() */
#include <videolan/vlc.h>
#include "video.h"
#include "video_output.h"
#include "i420_rgb.h"
#include "i420_rgb_c.h"
static void SetOffset( int, int, int, int, boolean_t *, int *, int * );
/*****************************************************************************
* I420_RGB8: color YUV 4:2:0 to RGB 8 bpp
*****************************************************************************/
void _M( I420_RGB8 )( vout_thread_t *p_vout, picture_t *p_source,
picture_t *p_dest )
{
/* We got this one from the old arguments */
u16 *p_pic = (u16*)p_dest->p->p_pixels;
u8 *p_y = p_source->Y_PIXELS;
u8 *p_u = p_source->U_PIXELS, *p_v = p_source->V_PIXELS;
/* FIXME: add margins here */
int i_pic_line_width = p_dest->p->i_pitch / 2;
boolean_t b_hscale; /* horizontal scaling type */
int i_vscale; /* vertical scaling type */
int i_x, i_y; /* horizontal and vertical indexes */
int i_scale_count; /* scale modulo counter */
int i_chroma_width; /* chroma width */
u16 * p_pic_start; /* beginning of the current line for copy */
u16 * p_buffer_start; /* conversion buffer start */
u16 * p_buffer; /* conversion buffer pointer */
int * p_offset_start; /* offset array start */
int * p_offset; /* offset array pointer */
/*
* Initialize some values - i_pic_line_width will store the line skip
*/
i_pic_line_width -= p_vout->output.i_width;
i_chroma_width = p_vout->render.i_width / 2;
p_buffer_start = (u16*)p_vout->chroma.p_sys->p_buffer;
p_offset_start = p_vout->chroma.p_sys->p_offset;
SetOffset( p_vout->render.i_width, p_vout->render.i_height,
p_vout->output.i_width, p_vout->output.i_height,
&b_hscale, &i_vscale, p_offset_start );
/* FIXME */
intf_ErrMsg( "vout error: I420_RGB8 unimplemented, "
"please harass sam@zoy.org" );
}
/* Following functions are local */
/*****************************************************************************
* SetOffset: build offset array for conversion functions
*****************************************************************************
* This function will build an offset array used in later conversion functions.
* It will also set horizontal and vertical scaling indicators. If b_double
* is set, the p_offset structure has interleaved Y and U/V offsets.
*****************************************************************************/
static void SetOffset( int i_width, int i_height, int i_pic_width,
int i_pic_height, boolean_t *pb_hscale,
int *pi_vscale, int *p_offset )
{
int i_x; /* x position in destination */
int i_scale_count; /* modulo counter */
/*
* Prepare horizontal offset array
*/
if( i_pic_width - i_width == 0 )
{
/* No horizontal scaling: YUV conversion is done directly to picture */
*pb_hscale = 0;
}
else if( i_pic_width - i_width > 0 )
{
int i_dummy = 0;
/* Prepare scaling array for horizontal extension */
*pb_hscale = 1;
i_scale_count = i_pic_width;
for( i_x = i_width; i_x--; )
{
while( (i_scale_count -= i_width) > 0 )
{
*p_offset++ = 0;
*p_offset++ = 0;
}
*p_offset++ = 1;
*p_offset++ = i_dummy;
i_dummy = 1 - i_dummy;
i_scale_count += i_pic_width;
}
}
else /* if( i_pic_width - i_width < 0 ) */
{
int i_remainder = 0;
int i_jump;
/* Prepare scaling array for horizontal reduction */
*pb_hscale = 1;
i_scale_count = i_width;
for( i_x = i_pic_width; i_x--; )
{
i_jump = 1;
while( (i_scale_count -= i_pic_width) > 0 )
{
i_jump += 1;
}
*p_offset++ = i_jump;
*p_offset++ = ( i_jump += i_remainder ) >> 1;
i_remainder = i_jump & 1;
i_scale_count += i_width;
}
}
/*
* Set vertical scaling indicator
*/
if( i_pic_height - i_height == 0 )
{
*pi_vscale = 0;
}
else if( i_pic_height - i_height > 0 )
{
*pi_vscale = 1;
}
else /* if( i_pic_height - i_height < 0 ) */
{
*pi_vscale = -1;
}
}
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* case by optimized functions. * case by optimized functions.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: chroma_common.h,v 1.1 2001/12/16 16:18:36 sam Exp $ * $Id: i420_rgb_c.h,v 1.1 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -53,11 +53,3 @@ ...@@ -53,11 +53,3 @@
#define V_RED_COEF ((int)(1.596 * (1<<SHIFT) / 1.164)) #define V_RED_COEF ((int)(1.596 * (1<<SHIFT) / 1.164))
#define V_GREEN_COEF ((int)(-0.813 * (1<<SHIFT) / 1.164)) #define V_GREEN_COEF ((int)(-0.813 * (1<<SHIFT) / 1.164))
/*****************************************************************************
* Extern prototypes
*****************************************************************************/
void _M( SetOffset )( int i_width, int i_height, int i_pic_width,
int i_pic_height, boolean_t *pb_h_scaling,
int *pi_v_scaling, int *p_offset, boolean_t b_double );
This diff is collapsed.
This diff is collapsed.
/*****************************************************************************
* i420_yuy2.h : YUV to YUV conversion module for vlc
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
* $Id: i420_yuy2.h,v 1.1 2002/01/04 14:01:34 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#ifdef MODULE_NAME_IS_chroma_i420_yuy2_mmx
#define UNUSED_LONGLONG(foo) \
unsigned long long foo __asm__ (#foo) __attribute__((unused))
UNUSED_LONGLONG(woo_00ffw) = 0x00ff00ff00ff00ff;
UNUSED_LONGLONG(woo_80w) = 0x0000000080808080;
#define MMX_YUV420_YUYV " \n\
movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\
movd (%4), %%mm1 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\
movd (%5), %%mm2 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\
punpcklbw %%mm2, %%mm1 # v3 u3 v2 u2 v1 u1 v0 u0 \n\
movq %%mm0, %%mm2 # y7 y6 y5 y4 y3 y2 y1 y0 \n\
punpcklbw %%mm1, %%mm2 # v1 y3 u1 y2 v0 y1 u0 y0 \n\
movq %%mm2, (%0) # Store low YUYV \n\
punpckhbw %%mm1, %%mm0 # v3 y7 u3 y6 v2 y5 u2 y4 \n\
movq %%mm0, 8(%0) # Store high YUYV \n\
movq (%3), %%mm0 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\
movq %%mm0, %%mm2 # Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\
punpcklbw %%mm1, %%mm2 # v1 Y3 u1 Y2 v0 Y1 u0 Y0 \n\
movq %%mm2, (%1) # Store low YUYV \n\
punpckhbw %%mm1, %%mm0 # v3 Y7 u3 Y6 v2 Y5 u2 Y4 \n\
movq %%mm0, 8(%1) # Store high YUYV \n\
"
#define MMX_YUV420_YVYU " \n\
movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\
movd (%4), %%mm2 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\
movd (%5), %%mm1 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\
punpcklbw %%mm2, %%mm1 # u3 v3 u2 v2 u1 v1 u0 v0 \n\
movq %%mm0, %%mm2 # y7 y6 y5 y4 y3 y2 y1 y0 \n\
punpcklbw %%mm1, %%mm2 # u1 y3 v1 y2 u0 y1 v0 y0 \n\
movq %%mm2, (%0) # Store low YUYV \n\
punpckhbw %%mm1, %%mm0 # u3 y7 v3 y6 u2 y5 v2 y4 \n\
movq %%mm0, 8(%0) # Store high YUYV \n\
movq (%3), %%mm0 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\
movq %%mm0, %%mm2 # Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\
punpcklbw %%mm1, %%mm2 # u1 Y3 v1 Y2 u0 Y1 v0 Y0 \n\
movq %%mm2, (%1) # Store low YUYV \n\
punpckhbw %%mm1, %%mm0 # u3 Y7 v3 Y6 u2 Y5 v2 Y4 \n\
movq %%mm0, 8(%1) # Store high YUYV \n\
"
#define MMX_YUV420_UYVY " \n\
movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\
movq (%3), %%mm3 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\
movd (%4), %%mm2 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\
movd (%5), %%mm1 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\
punpcklbw %%mm2, %%mm1 # u3 v3 u2 v2 u1 v1 u0 v0 \n\
movq %%mm1, %%mm2 # u3 v3 u2 v2 u1 v1 u0 v0 \n\
punpcklbw %%mm0, %%mm2 # y3 v1 y2 u1 y1 v0 y0 u0 \n\
movq %%mm2, (%0) # Store low UYVY \n\
movq %%mm1, %%mm2 # u3 v3 u2 v2 u1 v1 u0 v0 \n\
punpckhbw %%mm0, %%mm2 # y3 v1 y2 u1 y1 v0 y0 u0 \n\
movq %%mm2, 8(%0) # Store high UYVY \n\
movq %%mm1, %%mm2 # u3 v3 u2 v2 u1 v1 u0 v0 \n\
punpcklbw %%mm3, %%mm2 # Y3 v1 Y2 u1 Y1 v0 Y0 u0 \n\
movq %%mm2, (%1) # Store low UYVY \n\
punpckhbw %%mm3, %%mm1 # Y7 v3 Y6 u3 Y5 v2 Y4 u2 \n\
movq %%mm1, 8(%1) # Store high UYVY \n\
"
/* FIXME: this code does not work ! Chroma seems to be wrong. */
#define MMX_YUV420_Y211 " \n\
movq (%2), %%mm0 # Load 8 Y y7 y6 y5 y4 y3 y2 y1 y0 \n\
movq (%3), %%mm1 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\
movd (%4), %%mm2 # Load 4 Cb 00 00 00 00 u3 u2 u1 u0 \n\
movd (%5), %%mm3 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\
pand woo_00ffw, %%mm0 # get Y even 00 Y6 00 Y4 00 Y2 00 Y0 \n\
packuswb %%mm0, %%mm0 # pack Y y6 y4 y2 y0 y6 y4 y2 y0 \n\
pand woo_00ffw, %%mm2 # get U even 00 u6 00 u4 00 u2 00 u0 \n\
packuswb %%mm2, %%mm2 # pack U 00 00 u2 u0 00 00 u2 u0 \n\
pand woo_00ffw, %%mm3 # get V even 00 v6 00 v4 00 v2 00 v0 \n\
packuswb %%mm3, %%mm3 # pack V 00 00 v2 v0 00 00 v2 v0 \n\
punpcklbw %%mm3, %%mm2 # 00 00 00 00 v2 u2 v0 u0 \n\
psubsw woo_80w, %%mm2 # U,V -= 128 \n\
punpcklbw %%mm2, %%mm0 # v2 y6 u2 y4 v0 y2 u0 y0 \n\
movq %%mm0, (%0) # Store YUYV \n\
pand woo_00ffw, %%mm1 # get Y even 00 Y6 00 Y4 00 Y2 00 Y0 \n\
packuswb %%mm1, %%mm1 # pack Y Y6 Y4 Y2 Y0 Y6 Y4 Y2 Y0 \n\
punpcklbw %%mm2, %%mm1 # v2 Y6 u2 Y4 v0 Y2 u0 Y0 \n\
movq %%mm1, (%1) # Store YUYV \n\
"
#else
#define C_YUV420_YUYV( p_line1, p_line2, p_y1, p_y2, p_u, p_v ) \
*(p_line1)++ = *(p_y1)++; *(p_line2)++ = *(p_y2)++; \
*(p_line1)++ = *(p_line2)++ = *(p_u)++; \
*(p_line1)++ = *(p_y1)++; *(p_line2)++ = *(p_y2)++; \
*(p_line1)++ = *(p_line2)++ = *(p_v)++; \
#define C_YUV420_YVYU( p_line1, p_line2, p_y1, p_y2, p_u, p_v ) \
*(p_line1)++ = *(p_y1)++; *(p_line2)++ = *(p_y2)++; \
*(p_line1)++ = *(p_line2)++ = *(p_v)++; \
*(p_line1)++ = *(p_y1)++; *(p_line2)++ = *(p_y2)++; \
*(p_line1)++ = *(p_line2)++ = *(p_u)++; \
#define C_YUV420_UYVY( p_line1, p_line2, p_y1, p_y2, p_u, p_v ) \
*(p_line1)++ = *(p_line2)++ = *(p_u)++; \
*(p_line1)++ = *(p_y1)++; *(p_line2)++ = *(p_y2)++; \
*(p_line1)++ = *(p_line2)++ = *(p_v)++; \
*(p_line1)++ = *(p_y1)++; *(p_line2)++ = *(p_y2)++; \
#define C_YUV420_Y211( p_line1, p_line2, p_y1, p_y2, p_u, p_v ) \
*(p_line1)++ = *(p_y1); ((u16*)p_y1)++; \
*(p_line2)++ = *(p_y2); ((u16*)p_y2)++; \
*(p_line1)++ = *(p_line2)++ = *(p_u) - 0x80; ((u16*)p_u)++; \
*(p_line1)++ = *(p_y1); ((u16*)p_y1)++; \
*(p_line2)++ = *(p_y2); ((u16*)p_y2)++; \
*(p_line1)++ = *(p_line2)++ = *(p_v) - 0x80; ((u16*)p_v)++; \
#endif
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_directx.c: Windows DirectX video output display method * vout_directx.c: Windows DirectX video output display method
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: vout_directx.c,v 1.17 2001/12/30 07:09:54 sam Exp $ * $Id: vout_directx.c,v 1.18 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Gildas Bazin <gbazin@netcourrier.com> * Authors: Gildas Bazin <gbazin@netcourrier.com>
* *
...@@ -163,7 +163,7 @@ static int vout_Create( vout_thread_t *p_vout ) ...@@ -163,7 +163,7 @@ static int vout_Create( vout_thread_t *p_vout )
VOUT_FULLSCREEN_DEFAULT ); VOUT_FULLSCREEN_DEFAULT );
#if 0 #if 0
p_vout->b_need_render = !main_GetIntVariable( VOUT_OVERLAY_VAR, p_vout->b_need_render = !main_GetIntVariable( VOUT_OVERLAY_VAR,
VOUT_OVERLAY_DEFAULT ); VOUT_OVERLAY_DEFAULT );
#else #else
p_vout->b_need_render = 0; /* default = overlay */ p_vout->b_need_render = 0; /* default = overlay */
#endif #endif
...@@ -325,7 +325,7 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -325,7 +325,7 @@ static int vout_Manage( vout_thread_t *p_vout )
{ {
intf_WarnMsg( 3, "vout: vout_Manage Scale Change" ); intf_WarnMsg( 3, "vout: vout_Manage Scale Change" );
if( p_vout->b_need_render ) if( p_vout->b_need_render )
InvalidateRect( p_vout->p_sys->hwnd, NULL, TRUE ); InvalidateRect( p_vout->p_sys->hwnd, NULL, TRUE );
if( DirectXUpdateOverlay( p_vout ) ) if( DirectXUpdateOverlay( p_vout ) )
/* failed so try again next time */ /* failed so try again next time */
PostMessage( p_vout->p_sys->hwnd, WM_CHAR, (WPARAM)'S', 0); PostMessage( p_vout->p_sys->hwnd, WM_CHAR, (WPARAM)'S', 0);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_dummy.c: dummy input plugin, to manage "vlc:***" special options * input_dummy.c: dummy input plugin, to manage "vlc:***" special options
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: input_dummy.c,v 1.11 2001/12/30 07:09:55 sam Exp $ * $Id: input_dummy.c,v 1.12 2002/01/04 14:01:34 sam Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -118,6 +118,13 @@ static void DummyOpen( input_thread_t * p_input ) ...@@ -118,6 +118,13 @@ static void DummyOpen( input_thread_t * p_input )
psz_name += 4; psz_name += 4;
i_len -= 4; i_len -= 4;
/* Check for a "vlc:nop" command */
if( i_len == 3 && !strncasecmp( psz_name, "nop", 3 ) )
{
intf_WarnMsg( 2, "input: command `nop'" );
return;
}
/* Check for a "vlc:quit" command */ /* Check for a "vlc:quit" command */
if( i_len == 4 && !strncasecmp( psz_name, "quit", 4 ) ) if( i_len == 4 && !strncasecmp( psz_name, "quit", 4 ) )
{ {
......
This diff is collapsed.
...@@ -3,7 +3,7 @@ dvdread_SOURCES = dvdread.c input_dvdread.c $(SRC_DVDREAD_EXTRA) ...@@ -3,7 +3,7 @@ dvdread_SOURCES = dvdread.c input_dvdread.c $(SRC_DVDREAD_EXTRA)
ifeq (1,$(NEED_LIBDVDCSS)) ifeq (1,$(NEED_LIBDVDCSS))
LIBDVDCSS_OBJ = ../../lib/libdvdcss.a ../../lib/libdvdcss.so LIBDVDCSS_OBJ = ../../lib/libdvdcss.a ../../lib/libdvdcss.so
endif endif
LIBDVDREAD_OBJ = ../../lib/libdvdread.a ../../lib/libdvdread.so LIBDVDREAD_OBJ = ../../lib/libdvdread.a
EXTRA_DEP = $(LIBDVDCSS_OBJ) $(LIBDVDREAD_OBJ) EXTRA_DEP = $(LIBDVDCSS_OBJ) $(LIBDVDREAD_OBJ)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
memcpy_SOURCES = memcpy.c memcpy_SOURCES = memcpy.c
memcpymmx_SOURCES = memcpymmx.c memcpymmx_SOURCES = memcpy.c
memcpymmxext_SOURCES = memcpymmxext.c memcpymmxext_SOURCES = memcpy.c
memcpy3dn_SOURCES = memcpy3dn.c memcpy3dn_SOURCES = memcpy.c
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment