summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPetri Hintukainen <phintuka@users.sourceforge.net>2012-06-15 12:11:37 +0300
committerPetri Hintukainen <phintuka@users.sourceforge.net>2012-06-15 12:11:37 +0300
commit792ebfba1c222969181538340ec10d46a2278185 (patch)
tree1496dc2e933cb20dcddd29cee49370e2513f5e6f /src
parent7b1e1cf0b7ddfba9d79f47fe365619617b39fe08 (diff)
parenta214d323e70910f1572431c4f5d66001f57ef557 (diff)
downloadxine-lib-792ebfba1c222969181538340ec10d46a2278185.tar.gz
xine-lib-792ebfba1c222969181538340ec10d46a2278185.tar.bz2
Merge from 1.1
--HG-- rename : src/libxinevdec/gdkpixbuf.c => src/video_dec/gdkpixbuf.c rename : src/libxinevdec/image.c => src/video_dec/image.c
Diffstat (limited to 'src')
-rw-r--r--src/video_dec/gdkpixbuf.c22
-rw-r--r--src/video_dec/image.c33
-rw-r--r--src/video_out/video_out_xcbxv.c17
-rw-r--r--src/video_out/video_out_xv.c17
4 files changed, 68 insertions, 21 deletions
diff --git a/src/video_dec/gdkpixbuf.c b/src/video_dec/gdkpixbuf.c
index ed88323fb..972a04e9e 100644
--- a/src/video_dec/gdkpixbuf.c
+++ b/src/video_dec/gdkpixbuf.c
@@ -133,8 +133,24 @@ static void image_decode_data (video_decoder_t *this_gen, buf_element_t *buf) {
lprintf("image loaded successfully\n");
/*
+ * alloc video frame
+ */
+ img = this->stream->video_out->get_frame (this->stream->video_out, width, height,
+ (double)width / (double)height,
+ XINE_IMGFMT_YUY2,
+ VO_BOTH_FIELDS);
+
+ /* crop if allocated frame is smaller than requested */
+ if (width > img->width)
+ width = img->width;
+ if (height > img->height)
+ height = img->height;
+ img->ratio = (double)width / (double)height;
+
+ /*
* rgb data -> yuv_planes
*/
+ width &= ~1; /* must be even for init_yuv_planes */
init_yuv_planes(&yuv_planes, width, height);
n_channels = gdk_pixbuf_get_n_channels (pixbuf);
@@ -155,12 +171,8 @@ static void image_decode_data (video_decoder_t *this_gen, buf_element_t *buf) {
gdk_pixbuf_unref (pixbuf);
/*
- * alloc and draw video frame
+ * draw video frame
*/
- img = this->stream->video_out->get_frame (this->stream->video_out, width,
- height, (double)width/(double)height,
- XINE_IMGFMT_YUY2,
- VO_BOTH_FIELDS);
img->pts = buf->pts;
img->duration = 3600;
img->bad_frame = 0;
diff --git a/src/video_dec/image.c b/src/video_dec/image.c
index 8bc3962bb..539c65e26 100644
--- a/src/video_dec/image.c
+++ b/src/video_dec/image.c
@@ -102,7 +102,7 @@ static void image_decode_data (video_decoder_t *this_gen, buf_element_t *buf) {
this->index += buf->size;
if (buf->decoder_flags & BUF_FLAG_FRAME_END) {
- int width, height, i;
+ int width, height, i, x, y, img_stride;
int status;
MagickWand *wand;
uint8_t *img_buf, *img_buf_ptr;
@@ -133,9 +133,10 @@ static void image_decode_data (video_decoder_t *this_gen, buf_element_t *buf) {
return;
}
- width = MagickGetImageWidth(wand) & ~1; /* must be even for init_yuv_planes */
+ width = MagickGetImageWidth(wand);
height = MagickGetImageHeight(wand);
img_buf = malloc(width * height * 3);
+ img_stride = 3 * width;
#if MAGICK_VERSION < 0x671
MagickGetImagePixels(wand, 0, 0, width, height, "RGB", CharPixel, img_buf);
DestroyMagickWand(wand);
@@ -152,12 +153,29 @@ static void image_decode_data (video_decoder_t *this_gen, buf_element_t *buf) {
lprintf("image loaded successfully\n");
/*
+ * alloc video frame and set cropping
+ */
+ img = this->stream->video_out->get_frame (this->stream->video_out, width, height,
+ (double)width / (double)height,
+ XINE_IMGFMT_YUY2,
+ VO_BOTH_FIELDS);
+
+ if (width > img->width)
+ width = img->width;
+ if (height > img->height)
+ height = img->height;
+ img->ratio = (double)width / (double)height;
+
+ /*
* rgb data -> yuv_planes
*/
+ width &= ~1; /* must be even for init_yuv_planes */
init_yuv_planes(&yuv_planes, width, height);
img_buf_ptr = img_buf;
- for (i=0; i < width*height; i++) {
+ i = 0;
+ for (y = 0; y < height; y++) {
+ for (x = 0; x < width; x++) {
uint8_t r = *(img_buf_ptr++);
uint8_t g = *(img_buf_ptr++);
uint8_t b = *(img_buf_ptr++);
@@ -165,16 +183,15 @@ static void image_decode_data (video_decoder_t *this_gen, buf_element_t *buf) {
yuv_planes.y[i] = COMPUTE_Y(r, g, b);
yuv_planes.u[i] = COMPUTE_U(r, g, b);
yuv_planes.v[i] = COMPUTE_V(r, g, b);
+ i++;
+ }
+ img_buf_ptr += img_stride - 3 * width;
}
free(img_buf);
/*
- * alloc and draw video frame
+ * draw video frame
*/
- img = this->stream->video_out->get_frame (this->stream->video_out, width,
- height, (double)width/(double)height,
- XINE_IMGFMT_YUY2,
- VO_BOTH_FIELDS);
img->pts = buf->pts;
img->duration = 3600;
img->bad_frame = 0;
diff --git a/src/video_out/video_out_xcbxv.c b/src/video_out/video_out_xcbxv.c
index b6e272d37..f24141db7 100644
--- a/src/video_out/video_out_xcbxv.c
+++ b/src/video_out/video_out_xcbxv.c
@@ -99,6 +99,7 @@ typedef struct {
unsigned int xv_pitches[3];
unsigned int xv_offsets[3];
+ int req_width, req_height;
} xv_frame_t;
@@ -360,8 +361,8 @@ static void xv_update_frame_format (vo_driver_t *this_gen,
width = (width + 7) & ~0x7;
}
- if ((frame->width != width)
- || (frame->height != height)
+ if ((frame->req_width != width)
+ || (frame->req_height != height)
|| (frame->format != format)) {
/* printf (LOG_MODULE ": updating frame to %d x %d (ratio=%d, format=%08x)\n",width,height,ratio_code,format); */
@@ -390,13 +391,21 @@ static void xv_update_frame_format (vo_driver_t *this_gen,
frame->vo_frame.base[2] = frame->image + frame->xv_offsets[1];
}
- frame->width = width;
- frame->height = height;
+ /* allocated frame size may not match requested size */
+ frame->req_width = width;
+ frame->req_height = height;
+ frame->width = frame->xv_width;
+ frame->height = frame->xv_height;
frame->format = format;
pthread_mutex_unlock(&this->main_mutex);
}
+ if (frame->vo_frame.width > frame->width)
+ frame->vo_frame.width = frame->width;
+ if (frame->vo_frame.height > frame->height)
+ frame->vo_frame.height = frame->height;
+
frame->ratio = ratio;
}
diff --git a/src/video_out/video_out_xv.c b/src/video_out/video_out_xv.c
index 4e37e154b..a17017b7f 100644
--- a/src/video_out/video_out_xv.c
+++ b/src/video_out/video_out_xv.c
@@ -102,6 +102,7 @@ typedef struct {
XvImage *image;
XShmSegmentInfo shminfo;
+ int req_width, req_height;
} xv_frame_t;
@@ -443,8 +444,8 @@ static void xv_update_frame_format (vo_driver_t *this_gen,
width = (width + 7) & ~0x7;
}
- if ((frame->width != width)
- || (frame->height != height)
+ if ((frame->req_width != width)
+ || (frame->req_height != height)
|| (frame->format != format)) {
/* printf (LOG_MODULE ": updating frame to %d x %d (ratio=%d, format=%08x)\n",width,height,ratio_code,format); */
@@ -475,13 +476,21 @@ static void xv_update_frame_format (vo_driver_t *this_gen,
frame->vo_frame.base[2] = frame->image->data + frame->image->offsets[1];
}
- frame->width = width;
- frame->height = height;
+ /* allocated frame size may not match requested size */
+ frame->req_width = width;
+ frame->req_height = height;
+ frame->width = frame->image->width;
+ frame->height = frame->image->height;
frame->format = format;
UNLOCK_DISPLAY(this);
}
+ if (frame->vo_frame.width > frame->width)
+ frame->vo_frame.width = frame->width;
+ if (frame->vo_frame.height > frame->height)
+ frame->vo_frame.height = frame->height;
+
frame->ratio = ratio;
}