summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2010-06-05 23:34:17 +0300
committerUoti Urpala <uau@glyph.nonexistent.invalid>2010-06-05 23:35:42 +0300
commitdde8b753e417bb44e5f18ac9d6901deb95bf6ab0 (patch)
tree84fc2a73fc1f514417cacd61c9a57580ca47cd66 /libvo
parent331167ae132d35c821510307d8dd109ce27bfc1b (diff)
parent09bca6575f66394e1f4ba3845330d21d30895f3d (diff)
downloadmpv-dde8b753e417bb44e5f18ac9d6901deb95bf6ab0.tar.bz2
mpv-dde8b753e417bb44e5f18ac9d6901deb95bf6ab0.tar.xz
Merge svn changes r31318 to r31328
r31328 is a somewhat questionable (changing the option at that point isn't quite safe), but it was a failure case already...
Diffstat (limited to 'libvo')
-rw-r--r--libvo/geometry.c5
-rw-r--r--libvo/vo_yuv4mpeg.c270
2 files changed, 6 insertions, 269 deletions
diff --git a/libvo/geometry.c b/libvo/geometry.c
index 9d60ada29f..4bc08f811d 100644
--- a/libvo/geometry.c
+++ b/libvo/geometry.c
@@ -40,7 +40,7 @@ int geometry(int *xpos, int *ypos, int *widw, int *widh, int scrw, int scrh)
int width, height, xoff, yoff, xper, yper;
int i;
int ok = 0;
- for (i = 0; !ok && i < 8; i++) {
+ for (i = 0; !ok && i < 9; i++) {
width = height = xoff = yoff = xper = yper = INT_MIN;
strcpy(xsign, "+");
strcpy(ysign, "+");
@@ -72,6 +72,9 @@ int geometry(int *xpos, int *ypos, int *widw, int *widh, int scrw, int scrh)
case 7:
ok = sscanf(vo_geometry, "%i%1[%]%c", &xper, dummy, dummy) == 2;
break;
+ case 8:
+ ok = sscanf(vo_geometry, "%i%c", &xoff, dummy) == 1;
+ break;
}
}
if (!ok) {
diff --git a/libvo/vo_yuv4mpeg.c b/libvo/vo_yuv4mpeg.c
index 6578d4b66e..8b9900d270 100644
--- a/libvo/vo_yuv4mpeg.c
+++ b/libvo/vo_yuv4mpeg.c
@@ -54,11 +54,6 @@
#include "sub.h"
#include "fastmemcpy.h"
-#include "libswscale/swscale.h"
-#ifdef CONFIG_LIBSWSCALE_INTERNALS
-#include "libswscale/rgb2rgb.h"
-#endif
-#include "libmpcodecs/vf_scale.h"
#include "libavutil/rational.h"
static const vo_info_t info =
@@ -80,9 +75,6 @@ static uint8_t *image_y = NULL;
static uint8_t *image_u = NULL;
static uint8_t *image_v = NULL;
-static uint8_t *rgb_buffer = NULL;
-static uint8_t *rgb_line_buffer = NULL;
-
static char *yuv_filename = NULL;
static int using_format = 0;
@@ -127,18 +119,6 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
"Interlaced mode requires image height to be divisible by 4.");
return -1;
}
-
- rgb_line_buffer = malloc(image_width * 3);
- if (!rgb_line_buffer)
- {
- mp_tmsg(MSGT_VO,MSGL_FATAL,
- "Unable to allocate line buffer for interlaced mode.");
- return -1;
- }
-
- if (using_format == IMGFMT_YV12)
- mp_tmsg(MSGT_VO,MSGL_WARN,
- "Input not RGB, can't separate chrominance by fields!");
}
if (width % 2)
@@ -148,20 +128,6 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
return -1;
}
-#ifdef CONFIG_LIBSWSCALE_INTERNALS
- if(using_format != IMGFMT_YV12)
- {
- sws_rgb2rgb_init(get_sws_cpuflags());
- rgb_buffer = malloc(image_width * image_height * 3);
- if (!rgb_buffer)
- {
- mp_tmsg(MSGT_VO,MSGL_FATAL,
- "Not enough memory to allocate RGB framebuffer.");
- return -1;
- }
- }
-#endif
-
write_bytes = image_width * image_height * 3 / 2;
image = malloc(write_bytes);
@@ -186,44 +152,10 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
return 0;
}
-/* Only use when h divisable by 2! */
-static void swap_fields(uint8_t *ptr, const int h, const int stride)
-{
- int i;
-
- for (i=0; i<h; i +=2)
- {
- fast_memcpy(rgb_line_buffer , ptr + stride * i , stride);
- fast_memcpy(ptr + stride * i , ptr + stride * (i+1), stride);
- fast_memcpy(ptr + stride * (i+1), rgb_line_buffer , stride);
- }
-}
-
static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
unsigned char *srca, int stride) {
- switch (using_format)
- {
- case IMGFMT_YV12:
vo_draw_alpha_yv12(w, h, src, srca, stride,
image + y0 * image_width + x0, image_width);
- break;
-
- case IMGFMT_BGR|24:
- case IMGFMT_RGB|24:
- if (config_interlace != Y4M_ILACE_BOTTOM_FIRST)
- vo_draw_alpha_rgb24(w, h, src, srca, stride,
- rgb_buffer + (y0 * image_width + x0) * 3, image_width * 3);
- else
- {
- swap_fields (rgb_buffer, image_height, image_width * 3);
-
- vo_draw_alpha_rgb24(w, h, src, srca, stride,
- rgb_buffer + (y0 * image_width + x0) * 3, image_width * 3);
-
- swap_fields (rgb_buffer, image_height, image_width * 3);
- }
- break;
- }
}
static void draw_osd(void)
@@ -231,39 +163,6 @@ static void draw_osd(void)
vo_draw_text(image_width, image_height, draw_alpha);
}
-#ifdef CONFIG_LIBSWSCALE_INTERNALS
-static void deinterleave_fields(uint8_t *ptr, const int stride,
- const int img_height)
-{
- unsigned int i, j, k_start = 1, modv = img_height - 1;
- unsigned char *line_state = malloc(modv);
-
- for (i=0; i<modv; i++)
- line_state[i] = 0;
-
- line_state[0] = 1;
-
- while(k_start < modv)
- {
- i = j = k_start;
- fast_memcpy(rgb_line_buffer, ptr + stride * i, stride);
-
- while (!line_state[j])
- {
- line_state[j] = 1;
- i = j;
- j = j * 2 % modv;
- fast_memcpy(ptr + stride * i, ptr + stride * j, stride);
- }
- fast_memcpy(ptr + stride * i, rgb_line_buffer, stride);
-
- while(k_start < modv && line_state[k_start])
- k_start++;
- }
- free(line_state);
-}
-#endif
-
static void vo_y4m_write(const void *ptr, const size_t num_bytes)
{
if (fwrite(ptr, 1, num_bytes, yuv_out) != num_bytes)
@@ -273,50 +172,8 @@ static void vo_y4m_write(const void *ptr, const size_t num_bytes)
static int write_last_frame(void)
{
-
- uint8_t *upper_y, *upper_u, *upper_v, *rgb_buffer_lower;
- int rgb_stride, uv_stride, field_height;
- unsigned int i, low_ofs;
-
fprintf(yuv_out, "FRAME\n");
- if (using_format != IMGFMT_YV12)
- {
- rgb_stride = image_width * 3;
- uv_stride = image_width / 2;
-
- if (Y4M_IS_INTERLACED)
- {
- field_height = image_height / 2;
-
- upper_y = image;
- upper_u = upper_y + image_width * field_height;
- upper_v = upper_u + image_width * field_height / 4;
- low_ofs = image_width * field_height * 3 / 2;
- rgb_buffer_lower = rgb_buffer + rgb_stride * field_height;
-
- /* Write Y plane */
- for(i = 0; i < field_height; i++)
- {
- vo_y4m_write(upper_y + image_width * i, image_width);
- vo_y4m_write(upper_y + image_width * i + low_ofs, image_width);
- }
-
- /* Write U and V plane */
- for(i = 0; i < field_height / 2; i++)
- {
- vo_y4m_write(upper_u + uv_stride * i, uv_stride);
- vo_y4m_write(upper_u + uv_stride * i + low_ofs, uv_stride);
- }
- for(i = 0; i < field_height / 2; i++)
- {
- vo_y4m_write(upper_v + uv_stride * i, uv_stride);
- vo_y4m_write(upper_v + uv_stride * i + low_ofs, uv_stride);
- }
- return VO_TRUE; /* Image written; We have to stop here */
- }
- }
- /* Write progressive frame */
vo_y4m_write(image, write_bytes);
return VO_TRUE;
}
@@ -325,64 +182,6 @@ static void flip_page (void)
{
fprintf(yuv_out, "FRAME\n");
-#ifdef CONFIG_LIBSWSCALE_INTERNALS
- if (using_format != IMGFMT_YV12)
- {
- uint8_t *upper_y, *upper_u, *upper_v, *rgb_buffer_lower;
- int rgb_stride, uv_stride, field_height;
- unsigned int i, low_ofs;
-
- rgb_stride = image_width * 3;
- uv_stride = image_width / 2;
-
- if (Y4M_IS_INTERLACED)
- {
- field_height = image_height / 2;
-
- upper_y = image;
- upper_u = upper_y + image_width * field_height;
- upper_v = upper_u + image_width * field_height / 4;
- low_ofs = image_width * field_height * 3 / 2;
- rgb_buffer_lower = rgb_buffer + rgb_stride * field_height;
-
- deinterleave_fields(rgb_buffer, rgb_stride, image_height);
-
- rgb24toyv12(rgb_buffer, upper_y, upper_u, upper_v,
- image_width, field_height,
- image_width, uv_stride, rgb_stride);
- rgb24toyv12(rgb_buffer_lower, upper_y + low_ofs,
- upper_u + low_ofs, upper_v + low_ofs,
- image_width, field_height,
- image_width, uv_stride, rgb_stride);
-
- /* Write Y plane */
- for(i = 0; i < field_height; i++)
- {
- vo_y4m_write(upper_y + image_width * i, image_width);
- vo_y4m_write(upper_y + image_width * i + low_ofs, image_width);
- }
-
- /* Write U and V plane */
- for(i = 0; i < field_height / 2; i++)
- {
- vo_y4m_write(upper_u + uv_stride * i, uv_stride);
- vo_y4m_write(upper_u + uv_stride * i + low_ofs, uv_stride);
- }
- for(i = 0; i < field_height / 2; i++)
- {
- vo_y4m_write(upper_v + uv_stride * i, uv_stride);
- vo_y4m_write(upper_v + uv_stride * i + low_ofs, uv_stride);
- }
- return; /* Image written; We have to stop here */
- }
-
- rgb24toyv12(rgb_buffer, image_y, image_u, image_v,
- image_width, image_height,
- image_width, uv_stride, rgb_stride);
- }
-#endif
-
- /* Write progressive frame */
vo_y4m_write(image, write_bytes);
}
@@ -391,10 +190,6 @@ static int draw_slice(uint8_t *srcimg[], int stride[], int w,int h,int x,int y)
int i;
uint8_t *dst, *src = srcimg[0];
- switch (using_format)
- {
- case IMGFMT_YV12:
-
// copy Y:
dst = image_y + image_width * y + x;
for (i = 0; i < h; i++)
@@ -420,72 +215,19 @@ static int draw_slice(uint8_t *srcimg[], int stride[], int w,int h,int x,int y)
dstv += imgstride;
}
}
- break;
-
- case IMGFMT_BGR24:
- case IMGFMT_RGB24:
- dst = rgb_buffer + (image_width * y + x) * 3;
- for (i = 0; i < h; i++)
- {
- fast_memcpy(dst, src, w * 3);
- src += stride[0];
- dst += image_width * 3;
- }
- break;
- }
return 0;
}
static int draw_frame(uint8_t * src[])
{
- switch(using_format)
- {
- case IMGFMT_YV12:
// gets done in draw_slice
- break;
-
- case IMGFMT_BGR24:
- case IMGFMT_RGB24:
- fast_memcpy(rgb_buffer, src[0], image_width * image_height * 3);
- break;
- }
return 0;
}
static int query_format(uint32_t format)
{
-
- if (Y4M_IS_INTERLACED)
- {
- /* When processing interlaced material we want to get the raw RGB
- * data and do the YV12 conversion ourselves to have the chrominance
- * information sampled correct. */
-
- switch(format)
- {
- case IMGFMT_YV12:
- return VFCAP_CSP_SUPPORTED|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
-#ifdef CONFIG_LIBSWSCALE_INTERNALS
- case IMGFMT_BGR|24:
- case IMGFMT_RGB|24:
- return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
-#endif
- }
- }
- else
- {
-
- switch(format)
- {
- case IMGFMT_YV12:
- return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
-#ifdef CONFIG_LIBSWSCALE_INTERNALS
- case IMGFMT_BGR|24:
- case IMGFMT_RGB|24:
- return VFCAP_CSP_SUPPORTED|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
-#endif
- }
- }
+ if (format == IMGFMT_YV12)
+ return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;
return 0;
}
@@ -500,14 +242,6 @@ static void uninit(void)
fclose(yuv_out);
yuv_out = NULL;
- if(rgb_buffer)
- free(rgb_buffer);
- rgb_buffer = NULL;
-
- if(rgb_line_buffer)
- free(rgb_line_buffer);
- rgb_line_buffer = NULL;
-
if (yuv_filename)
free(yuv_filename);
yuv_filename = NULL;