summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_zr.c63
1 files changed, 28 insertions, 35 deletions
diff --git a/libvo/vo_zr.c b/libvo/vo_zr.c
index 90e133b47b..df0536a3d5 100644
--- a/libvo/vo_zr.c
+++ b/libvo/vo_zr.c
@@ -66,7 +66,6 @@ typedef struct {
char *device; /* /dev/video1 */
int bw; /* if bw == 1, display in black&white */
int norm; /* PAL/NTSC */
- int buffer_size; /* MJPEG buffer size */
/* buffers + pointers + info */
@@ -75,7 +74,6 @@ typedef struct {
int off_y, off_c, stride; /* for use by 'draw slice/frame' */
unsigned char *buf; /* the jpeg images will be placed here */
- unsigned int buf_allocated; /* size of the block actually allocated */
jpeg_enc_t *j;
unsigned char *y_data, *u_data, *v_data; /* used by the jpeg encoder */
int y_stride, u_stride, v_stride; /* these point somewhere in image */
@@ -86,26 +84,27 @@ typedef struct {
int frame, synco, queue; /* buffer management */
struct mjpeg_sync zs; /* state information */
struct mjpeg_params p;
+ struct mjpeg_requestbuffers zrq;
struct video_capability vc; /* max resolution and so on */
int fields, stretchy; /* must the *image be interlaced
or stretched to fit on the screen? */
} zr_info_t;
static zr_info_t zr_info[ZR_MAX_DEVICES] = {
- {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, 128, NULL, 0, 0, 0, 0, 0,
- 0, NULL, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, 128, NULL, 0, 0, 0, 0, 0,
- 0, NULL, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, 128, NULL, 0, 0, 0, 0, 0,
- 0, NULL, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, 128, NULL, 0, 0, 0, 0, 0,
- 0, NULL, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+ {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, NULL, 0, 0, 0, 0, 0,
+ 0, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, NULL, 0, 0, 0, 0, 0,
+ 0, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, NULL, 0, 0, 0, 0, 0,
+ 0, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 1, 1, -1, -1, 2, {0, 0, 0, 0, 0}, NULL, 0, VIDEO_MODE_AUTO, NULL, 0, 0, 0, 0, 0,
+ 0, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
#define MJPEG_NBUFFERS 2
-/*#define MJPEG_SIZE 1024*128*/
+#define MJPEG_SIZE 1024*256
int zoran_getcap(zr_info_t *zr) {
@@ -184,7 +183,6 @@ int zoran_getcap(zr_info_t *zr) {
}
int init_zoran(zr_info_t *zr, int stretchx, int stretchy) {
- struct mjpeg_requestbuffers zrq;
/* center the image, and stretch it as far as possible (try to keep
* aspect) and check if it fits */
if (zr->image_width > zr->vc.maxwidth) {
@@ -223,21 +221,26 @@ int init_zoran(zr_info_t *zr, int stretchx, int stretchy) {
return 1;
}
- zrq.count = MJPEG_NBUFFERS;
- zrq.size = 1024*zr->buffer_size;
+ zr->zrq.count = MJPEG_NBUFFERS;
+ zr->zrq.size = MJPEG_SIZE;
- if (ioctl(zr->vdes, MJPIOC_REQBUFS, &zrq)) {
- mp_msg(MSGT_VO, MSGL_ERR, "zr: error requesting %d buffers of size %d\n", zrq.count, zrq.size);
+ if (ioctl(zr->vdes, MJPIOC_REQBUFS, &zr->zrq)) {
+ mp_msg(MSGT_VO, MSGL_ERR, "zr: error requesting %d buffers of size %d\n", zr->zrq.count, zr->zrq.size);
return 1;
}
/* the buffer count allocated may be different to the request */
- zr->buf_allocated = zrq.count * zrq.size;
- zr->buf = (unsigned char*)mmap(0, zrq.count*zrq.size,
+ zr->buf = (unsigned char*)mmap(0, zr->zrq.count*zr->zrq.size,
PROT_READ|PROT_WRITE, MAP_SHARED, zr->vdes, 0);
if (zr->buf == MAP_FAILED) {
- mp_msg(MSGT_VO, MSGL_ERR, "zr: error requesting %d buffers of size %d\n", zrq.count, zrq.size);
+ mp_msg(MSGT_VO, MSGL_ERR, "zr: error requesting %d buffers of size %d\n", zr->zrq.count, zr->zrq.size);
+ return 1;
+ }
+
+ mp_msg(MSGT_VO, MSGL_V, "zr: got %d buffers of size %d (wanted %d buffers of size %d)\n", zr->zrq.count, zr->zrq.size, MJPEG_NBUFFERS, MJPEG_SIZE);
+ if (zr->zrq.count < MJPEG_NBUFFERS) {
+ mp_msg(MSGT_VO, MSGL_V, "zr: got not enough buffers\n");
return 1;
}
@@ -261,7 +264,7 @@ void uninit_zoran(zr_info_t *zr) {
zr->frame = -1;
if (ioctl(zr->vdes, MJPIOC_QBUF_PLAY, &zr->frame) < 0)
mp_msg(MSGT_VO, MSGL_ERR, "zr: error stopping playback of last frame\n");
- if (munmap(zr->buf,zr->buf_allocated))
+ if (munmap(zr->buf,zr->zrq.count*zr->zrq.size))
mp_msg(MSGT_VO, MSGL_ERR, "zr: error unmapping buffer\n");
close(zr->vdes);
}
@@ -491,6 +494,9 @@ static void flip_page (void) {
/* do we have a free buffer? */
for (j = 0; j < zr_count; j++) {
zr_info_t *zr = &zr_info[j];
+ /* using MJPEG_NBUFFERS here, using the real number of
+ * buffers may give sync issues (real number of buffers
+ * is always sufficient) */
if (zr->queue-zr->synco < MJPEG_NBUFFERS) {
zr->frame = zr->queue;
} else {
@@ -504,9 +510,8 @@ static void flip_page (void) {
k+=jpeg_enc_frame(zr->j, zr->y_data + i*zr->y_stride,
zr->u_data + i*zr->u_stride,
zr->v_data + i*zr->v_stride,
- zr->buf+
- 1024*zr->frame*zr->buffer_size+k);
- if (k > 1024*zr->buffer_size) mp_msg(MSGT_VO, MSGL_WARN, "zr: jpeg image too large or buffer size too small, try -zrbsize 256. If your\nmotherboard/card combo can't handle that: lower the jpeg encoding quality\nor the resolution of the movie. Image may become distorted, MPlayer may crash.\nDon't bugreport, it is a known problem. The standard buffer size of 128kB\nshould be sufficient and is a safe-for-almost-all choice.\n");
+ zr->buf + zr->frame*zr->zrq.size+k);
+ if (k > zr->zrq.size) mp_msg(MSGT_VO, MSGL_WARN, "zr: jpeg image too large for maximum buffer size. Lower the jpeg encoding\nquality or the resolution of the movie.\n");
}
/* Warning: Only the first jpeg image contains huffman- and
* quantisation tables, so don't expect files other than
@@ -699,11 +704,6 @@ vo_zr_parseoption(m_option_t* conf, char *opt, char *param){
if (i != 1 && i != 2 && i != 4) return ERR_OUT_OF_RANGE;
zr->hdec = i;
return 1;
- }else if (!strcasecmp(opt, "zrbsize")) {
- i = atoi(param);
- if (i < 32) return ERR_OUT_OF_RANGE;
- zr->buffer_size = i;
- return 1;
}else if (!strcasecmp(opt, "zrvdec")) {
i = atoi(param);
if (i != 1 && i != 2 && i != 4) return ERR_OUT_OF_RANGE;
@@ -756,11 +756,6 @@ vo_zr_parseoption(m_option_t* conf, char *opt, char *param){
" -zrquality jpeg compression quality [BEST] 1 - 20 [VERY BAD]\n"
" -zrdev playback device (example -zrdev /dev/video1)\n"
" -zrnorm specify norm PAL/NTSC (default: leave at current setting)\n"
- " -zrbsize set the MPJEG buffer size to a number of kilobytes (def. 128)\n"
- " use this if MPlayer complains about the MJPEG buffer size\n"
- " being too small, 256kB is recommended. If your card/mobo\n"
- " doesn't allow buffers > 128kB lower the jpeg encoding\n"
- " quality or the resolution of the movie\n"
"\n"
"Cinerama support: additional occurances of -zrcrop activate cinerama mode,\n"
"suppose you have a 704x272 movie, two DC10+ cards and two beamers (or tv's),\n"
@@ -796,8 +791,6 @@ void vo_zr_revertoption(m_option_t* opt,char* param) {
zr->fd=0;
else if (!strcasecmp(param, "zrcrop"))
zr->g.set = zr->g.xoff = zr->g.yoff = 0;
- else if (!strcasecmp(param, "zrbsize"))
- zr->buffer_size = 128;
else if (!strcasecmp(param, "zrhdec"))
zr->hdec = 1;
else if (!strcasecmp(param, "zrvdec"))