mirror of https://github.com/mpv-player/mpv
XorA added the option of switching between fame/avcodec without
recompiling. Docs updated accordingly git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5362 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
c1205011cc
commit
95a5682456
87
DOCS/DXR3
87
DOCS/DXR3
|
@ -7,8 +7,10 @@ harddisk.
|
|||
1. Requirements
|
||||
|
||||
* First of all you will need the DXR3/H+ drivers properly installed.
|
||||
Version 0.10.0 or later. You can find it at
|
||||
Version 0.12.0 or later. You can find it at
|
||||
http://dxr3.sourceforge.net/
|
||||
(you only need to run "make install devices" in em8300-x.y.z/modules
|
||||
not in the root dir)
|
||||
|
||||
* Run <mplayerdir>/configure and make sure that DXR3/H+ support = yes
|
||||
if you want to play files other than mpeg libmp1e should be = yes as well
|
||||
|
@ -19,57 +21,40 @@ harddisk.
|
|||
|
||||
|
||||
2. Usage
|
||||
|
||||
-vo dxr3:<devicenum> For video output :<devicenum> is not
|
||||
needed unless you have more than one
|
||||
em8300 device in your computer
|
||||
-vo dxr3:noprebuf Turn of prebuffering. This is only
|
||||
needed if you are having sync issues
|
||||
with normal playback, this will make
|
||||
playback appear less smooth and will
|
||||
not use all available cpu power when
|
||||
playing non-mpeg content.
|
||||
* With prebuffering A-V: should be
|
||||
negative, if it's nonnegative your
|
||||
computer is too slow to properly
|
||||
play the video and you should
|
||||
disble prebuffering if you have
|
||||
sync issues.
|
||||
Without prebuffering this value
|
||||
should stay close to 0 at all
|
||||
times.
|
||||
* Some very fast computers seems to
|
||||
have issues with prebuffering.
|
||||
Blame Sigma for that ;).
|
||||
You can safely use :noprebuf since
|
||||
your machines are fast enough to give
|
||||
you smooth playback anyway.
|
||||
* If you plan to do other stuff that
|
||||
uses resources simultaneously with
|
||||
watching video, this options is
|
||||
probably preffered as it is much less
|
||||
sensitive to syncloss.
|
||||
* If you loose sync do a small seek
|
||||
(using left/right arrow, it will
|
||||
resync)
|
||||
-ao oss:<devicefile> For audio output
|
||||
-vo dxr3:<noprebuf>:<codec>:<device>Where noprebuf specifies to turn off
|
||||
prebuffering. This is done automatically
|
||||
on athlons. If playback is out of sync
|
||||
try disabling prebuffering. If noprebuf
|
||||
is left out prebuffering is enabled
|
||||
(except on athlons).
|
||||
|
||||
<codec> = fame/avcodec, avcodec produces
|
||||
better quality output, but fame is
|
||||
faster for those of you with slow
|
||||
machines. The default is to use
|
||||
libavcodec. Note that you need
|
||||
libavcodec properly installed (read
|
||||
DOCS/codecs.html)
|
||||
|
||||
<device> = device number to use in case
|
||||
you have more than one em8300 card
|
||||
|
||||
Any of these options may be left out,
|
||||
but they must be specified in this order
|
||||
i.e. dxr3:fame works, dxr3:1 works but
|
||||
dxr3:1:avcodec will not.
|
||||
These new features were added by XorA,
|
||||
he usually hangs out in #dxr3 on
|
||||
irc.openprojects.net, let him know
|
||||
you like it...
|
||||
-ao oss:/dev/em8300_ma-X For audio output, where X is the device
|
||||
number (0 if one card)
|
||||
-ac hwac3 For digital audio output instead of
|
||||
analog
|
||||
-vc mpegpes For mpeg playback
|
||||
-vc mpegpes For hardware accelerated mpeg playback
|
||||
-aop list=resample:fout=48000 If samplerate is below 44100Hz
|
||||
This does not work with digital audio
|
||||
output (-ac hwac3)
|
||||
<devicenum> Number of device to use for playback
|
||||
(if you have more than one card.).
|
||||
This can usually be left out (-vo dxr3).
|
||||
Mandrake 8.1 uses devfs by default. If
|
||||
you are running mandrake 8.1 please use
|
||||
-vo dxr3:0
|
||||
<devicefile> Normally /dev/em8300_ma or
|
||||
/dev/em8300_ma-<devicenum>
|
||||
(-ao dxr3:/dev/em8300_ma). If left out
|
||||
the default oss device will be used
|
||||
(normally soundcard).
|
||||
|
||||
MPEG-1, MPEG-2, VCD and DVD Notes
|
||||
There are some important notes to take into account here for optimum playback.
|
||||
|
@ -80,14 +65,6 @@ in software, which is much slower.
|
|||
Note that you cannot use -vc mpegpes with movies that aren't mpeg 1 or 2 or
|
||||
you will get an error message saying "Can't find codec for video format...".
|
||||
|
||||
* If you run mplayer as root, or set userid root it will use your pc's internal
|
||||
realtime clockgenerator for syncing. (If your kernel supports it (It's
|
||||
located in character devices and called "Enhanced realtime clock support")).
|
||||
Some people report that this has improved playback (which it should), but
|
||||
others have had problems with it. You will have to experiment yourself with
|
||||
this to find your optimum setup.
|
||||
|
||||
|
||||
|
||||
3. Contacting me
|
||||
|
||||
|
|
120
libvo/vo_dxr3.c
120
libvo/vo_dxr3.c
|
@ -6,6 +6,10 @@
|
|||
*/
|
||||
|
||||
/* ChangeLog added 2002-01-10
|
||||
* 2002-03-26:
|
||||
* XorA added an option parser and support for selecting encoder
|
||||
* codec. We thank him again.
|
||||
*
|
||||
* 2002-03-25:
|
||||
* A couple of bugfixes by XorA
|
||||
*
|
||||
|
@ -83,11 +87,9 @@
|
|||
#include "../postproc/swscale.h"
|
||||
#include "../cpudetect.h"
|
||||
|
||||
#ifndef USE_LIBAVCODEC
|
||||
# define USE_LIBFAME
|
||||
#else
|
||||
# undef USE_LIBFAME
|
||||
#endif
|
||||
#define USE_LIBFAME
|
||||
|
||||
/* Libfame codec initialisation */
|
||||
#ifdef USE_LIBFAME
|
||||
#include "../libfame/fame.h"
|
||||
static unsigned char *outbuf = NULL;
|
||||
|
@ -95,7 +97,10 @@ static fame_parameters_t fame_params;
|
|||
static fame_yuv_t fame_yuv;
|
||||
static fame_context_t *fame_ctx = NULL;
|
||||
static fame_object_t *fame_obj;
|
||||
#elif USE_LIBAVCODEC
|
||||
#endif
|
||||
|
||||
/* libavcodec codec initialisation */
|
||||
#ifdef USE_LIBAVCODEC
|
||||
#ifdef USE_LIBAVCODEC_SO
|
||||
#include <libffmpeg/avcodec.h>
|
||||
#else
|
||||
|
@ -116,6 +121,21 @@ int picture_linesize[] = { 0, 0, 0 };
|
|||
#endif
|
||||
|
||||
LIBVO_EXTERN (dxr3)
|
||||
/* codec control */
|
||||
enum MpegCodec
|
||||
{
|
||||
MPG_CODEC_NON,
|
||||
MPG_CODEC_AVCODEC,
|
||||
MPG_CODEC_FAME
|
||||
};
|
||||
|
||||
#if defined(USE_LIBFAME)
|
||||
static int mpeg_codec = MPG_CODEC_FAME;
|
||||
#elif defined(USE_LIBAVCODEC)
|
||||
static int mpeg_codec = MPG_CODEC_AVCODEC;
|
||||
#else
|
||||
statuc int mpeg_codec = MPG_CODEC_NONE;
|
||||
#endif
|
||||
|
||||
/* Resolutions and positions */
|
||||
static int v_width, v_height;
|
||||
|
@ -284,7 +304,11 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
|
|||
picture_linesize[0] = s_width;
|
||||
picture_linesize[1] = s_width / 2;
|
||||
picture_linesize[2] = s_width / 2;
|
||||
switch(mpeg_codec)
|
||||
{
|
||||
#ifdef USE_LIBFAME
|
||||
case MPG_CODEC_FAME:
|
||||
printf("VO: [dxr3] Using FAME\n");
|
||||
fame_ctx = fame_open();
|
||||
if (!fame_ctx) {
|
||||
printf("VO: [dxr3] Cannot open libFAME!\n");
|
||||
|
@ -340,7 +364,11 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
|
|||
fame_yuv.y = picture_data[0];
|
||||
fame_yuv.u = picture_data[1];
|
||||
fame_yuv.v = picture_data[2];
|
||||
#elif USE_LIBAVCODEC
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_LIBAVCODEC
|
||||
case MPG_CODEC_AVCODEC:
|
||||
printf("VO: [dxr3] Using AVCODEC\n");
|
||||
avc_codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO);
|
||||
if (!avc_codec) {
|
||||
printf("VO: [dxr3] Unable to find mpeg1video codec\n");
|
||||
|
@ -376,7 +404,10 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
|
|||
avc_picture.data[0] = picture_data[0];
|
||||
avc_picture.data[1] = picture_data[1];
|
||||
avc_picture.data[2] = picture_data[2];
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
sws = getSwsContextFromCmdLine(v_width, v_height, img_format, s_width, s_height, IMGFMT_YV12);
|
||||
if (!sws) {
|
||||
printf("vo_vesa: Can't initialize SwScaler\n");
|
||||
|
@ -441,13 +472,21 @@ static uint32_t draw_frame(uint8_t * src[])
|
|||
int size, srcStride = (img_format == IMGFMT_YUY2) ? (v_width * 2) : (v_width * 3);
|
||||
sws->swScale(sws, src, &srcStride, 0, v_height, picture_data, picture_linesize);
|
||||
draw_osd();
|
||||
switch(mpeg_codec)
|
||||
{
|
||||
#ifdef USE_LIBFAME
|
||||
case MPG_CODEC_FAME:
|
||||
size = fame_encode_frame(fame_ctx, &fame_yuv, NULL);
|
||||
write(fd_video, outbuf, size);
|
||||
#elif USE_LIBAVCODEC
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_LIBAVCODEC
|
||||
case MPG_CODEC_AVCODEC:
|
||||
size = avcodec_encode_video(avc_context, picture_data[0], avc_outbuf_size, &avc_picture);
|
||||
write(fd_video, picture_data[0], size);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
|
@ -455,20 +494,29 @@ static uint32_t draw_frame(uint8_t * src[])
|
|||
|
||||
static void flip_page(void)
|
||||
{
|
||||
int size;
|
||||
if (!noprebuf) {
|
||||
ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts);
|
||||
}
|
||||
if (img_format == IMGFMT_YV12) {
|
||||
switch(mpeg_codec)
|
||||
{
|
||||
#ifdef USE_LIBFAME
|
||||
int size = fame_encode_frame(fame_ctx, &fame_yuv, NULL);
|
||||
case MPG_CODEC_FAME:
|
||||
size = fame_encode_frame(fame_ctx, &fame_yuv, NULL);
|
||||
write(fd_video, outbuf, size);
|
||||
#elif USE_LIBAVCODEC
|
||||
int size = avcodec_encode_video(avc_context, picture_data[0], avc_outbuf_size, &avc_picture);
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_LIBAVCODEC
|
||||
case MPG_CODEC_AVCODEC:
|
||||
size = avcodec_encode_video(avc_context, picture_data[0], avc_outbuf_size, &avc_picture);
|
||||
if (!noprebuf) {
|
||||
ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts);
|
||||
}
|
||||
write(fd_video, picture_data[0], size);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -487,15 +535,24 @@ static void uninit(void)
|
|||
if (sws) {
|
||||
freeSwsContext(sws);
|
||||
}
|
||||
|
||||
switch(mpeg_codec)
|
||||
{
|
||||
#ifdef USE_LIBFAME
|
||||
case MPG_CODEC_FAME:
|
||||
if (fame_ctx) {
|
||||
fame_close(fame_ctx);
|
||||
}
|
||||
#elif USE_LIBAVCODEC
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_LIBAVCODEC
|
||||
case MPG_CODEC_AVCODEC:
|
||||
if (avc_context) {
|
||||
avcodec_close(avc_context);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
if (picture_data[0]) {
|
||||
free(picture_data[0]);
|
||||
}
|
||||
|
@ -522,13 +579,39 @@ static uint32_t preinit(const char *arg)
|
|||
|
||||
GetCpuCaps(&cpucaps);
|
||||
/* Open the control interface */
|
||||
if ((arg && !strcmp("noprebuf", arg)) || cpucaps.has3DNowExt) {
|
||||
if (arg && !strncmp("noprebuf", arg,8)) {
|
||||
printf("VO: [dxr3] Disabling prebuffering.\n");
|
||||
noprebuf = 1;
|
||||
fdflags |= O_NONBLOCK;
|
||||
arg=strchr(arg,':');
|
||||
if(arg) arg++;
|
||||
}
|
||||
|
||||
if(cpucaps.has3DNowExt)
|
||||
{
|
||||
printf("VO: [dxr3] fast AMD special disabling prebuffering.\n");
|
||||
noprebuf = 1;
|
||||
fdflags |= O_NONBLOCK;
|
||||
}
|
||||
|
||||
if (arg && !noprebuf) {
|
||||
#if defined(USE_LIBFAME)
|
||||
printf("VO: [dxr3] FAME supported\n");
|
||||
if (arg && !strncmp("fame",arg,4)) {
|
||||
mpeg_codec=MPG_CODEC_FAME;
|
||||
arg=strchr(arg,':');
|
||||
if(arg) arg++;
|
||||
}
|
||||
#endif
|
||||
#if defined(USE_LIBAVCODEC)
|
||||
printf("VO: [dxr3] AVCODEC supported\n");
|
||||
if (arg && !strncmp("avcodec",arg,7)) {
|
||||
mpeg_codec=MPG_CODEC_AVCODEC;
|
||||
arg=strchr(arg,':');
|
||||
if(arg) arg++;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (arg && arg[0]) {
|
||||
printf("VO: [dxr3] Forcing use of device %s\n", arg);
|
||||
sprintf(devname, "/dev/em8300-%s", arg);
|
||||
} else {
|
||||
|
@ -590,10 +673,11 @@ static uint32_t preinit(const char *arg)
|
|||
}
|
||||
}
|
||||
|
||||
#if !defined(USE_LIBFAME) && defined(USE_LIBAVCODEC)
|
||||
avcodec_init();
|
||||
avcodec_register_all();
|
||||
#endif
|
||||
if(mpeg_codec==MPG_CODEC_AVCODEC)
|
||||
{
|
||||
avcodec_init();
|
||||
avcodec_register_all();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue