Mercurial > mplayer.hg
changeset 31254:e888e262e3f0
Remove colorspace conversion code from -vo yuv4mpeg, -vf scale should
be able to handle this just as well (or better) including interlaced.
If not, this needs to be fixed there instead of duplicating code.
author | reimar |
---|---|
date | Sat, 05 Jun 2010 06:45:01 +0000 |
parents | b470391059f3 |
children | e05d1ff84b61 |
files | DOCS/man/en/mplayer.1 help/help_mp-en.h libvo/vo_yuv4mpeg.c |
diffstat | 3 files changed, 5 insertions(+), 271 deletions(-) [+] |
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1 Sat Jun 05 06:41:43 2010 +0000 +++ b/DOCS/man/en/mplayer.1 Sat Jun 05 06:45:01 2010 +0000 @@ -4349,7 +4349,9 @@ images and stores it in a file (default: ./stream.yuv). The format is the same as the one employed by mjpegtools, so this is useful if you want to process the video with the mjpegtools suite. -It supports the YV12, RGB (24 bpp) and BGR (24 bpp) format. +It supports the YV12 format. +If your source file has a different format and is interlaced, make sure +to use -vf scale=::1 to ensure the conversion uses interlaced mode. You can combine it with the \-fixed\-vo option to concatenate files with the same dimensions and fps value. .PD 0
--- a/help/help_mp-en.h Sat Jun 05 06:41:43 2010 +0000 +++ b/help/help_mp-en.h Sat Jun 05 06:45:01 2010 +0000 @@ -1110,9 +1110,7 @@ // vo_yuv4mpeg.c #define MSGTR_VO_YUV4MPEG_InterlacedHeightDivisibleBy4 "Interlaced mode requires image height to be divisible by 4." #define MSGTR_VO_YUV4MPEG_InterlacedLineBufAllocFail "Unable to allocate line buffer for interlaced mode." -#define MSGTR_VO_YUV4MPEG_InterlacedInputNotRGB "Input not RGB, can't separate chrominance by fields!" #define MSGTR_VO_YUV4MPEG_WidthDivisibleBy2 "Image width must be divisible by 2." -#define MSGTR_VO_YUV4MPEG_NoMemRGBFrameBuf "Not enough memory to allocate RGB framebuffer." #define MSGTR_VO_YUV4MPEG_OutFileOpenError "Can't get memory or file handle to write \"%s\"!" #define MSGTR_VO_YUV4MPEG_OutFileWriteError "Error writing image to output!" #define MSGTR_VO_YUV4MPEG_UnknownSubDev "Unknown subdevice: %s"
--- a/libvo/vo_yuv4mpeg.c Sat Jun 05 06:41:43 2010 +0000 +++ b/libvo/vo_yuv4mpeg.c Sat Jun 05 06:45:01 2010 +0000 @@ -55,11 +55,6 @@ #include "sub.h" #include "fastmemcpy.h" -#include "libswscale/swscale.h" -#ifdef CONFIG_LIBSWSCALE_A -#include "libswscale/rgb2rgb.h" -#endif -#include "libmpcodecs/vf_scale.h" #include "libavutil/rational.h" static const vo_info_t info = @@ -81,9 +76,6 @@ 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; @@ -128,18 +120,6 @@ MSGTR_VO_YUV4MPEG_InterlacedHeightDivisibleBy4); return -1; } - - rgb_line_buffer = malloc(image_width * 3); - if (!rgb_line_buffer) - { - mp_msg(MSGT_VO,MSGL_FATAL, - MSGTR_VO_YUV4MPEG_InterlacedLineBufAllocFail); - return -1; - } - - if (using_format == IMGFMT_YV12) - mp_msg(MSGT_VO,MSGL_WARN, - MSGTR_VO_YUV4MPEG_InterlacedInputNotRGB); } if (width % 2) @@ -149,20 +129,6 @@ return -1; } -#ifdef CONFIG_LIBSWSCALE_A - if(using_format != IMGFMT_YV12) - { - sws_rgb2rgb_init(get_sws_cpuflags()); - rgb_buffer = malloc(image_width * image_height * 3); - if (!rgb_buffer) - { - mp_msg(MSGT_VO,MSGL_FATAL, - MSGTR_VO_YUV4MPEG_NoMemRGBFrameBuf); - return -1; - } - } -#endif - write_bytes = image_width * image_height * 3 / 2; image = malloc(write_bytes); @@ -187,44 +153,10 @@ 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) @@ -232,39 +164,6 @@ vo_draw_text(image_width, image_height, draw_alpha); } -#ifdef CONFIG_LIBSWSCALE_A -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) @@ -274,50 +173,8 @@ 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; } @@ -326,64 +183,6 @@ { fprintf(yuv_out, "FRAME\n"); -#ifdef CONFIG_LIBSWSCALE_A - 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); } @@ -392,10 +191,6 @@ 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++) @@ -421,72 +216,19 @@ 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_A - 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_A - 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; } @@ -501,14 +243,6 @@ 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;