static int query_formats(AVFilterContext *ctx) { AVFilterFormats *formats = NULL; int fmt, ret; for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); if (is_planar_yuv(desc) && (ret = ff_add_format(&formats, fmt)) < 0) return ret; } return ff_set_common_formats(ctx, formats); }
static int query_formats(AVFilterContext *ctx) { AVFilterFormats *formats = NULL; int fmt; for (fmt = 0; fmt < AV_PIX_FMT_NB; fmt++) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); if (is_planar_yuv(desc)) ff_add_format(&formats, fmt); } ff_set_common_formats(ctx, formats); return 0; }
static void write_yvyu_to_yuv(GF_VideoSurface *vs, unsigned char *src, u32 src_stride, u32 src_pf, u32 src_width, u32 src_height, const GF_Window *src_wnd) { u32 i, j, base_pf; unsigned char *pY, *pU, *pV; switch (get_yuv_base(src_pf) ) { case GF_PIXEL_UYVY: pU = src + src_stride * src_wnd->y + src_wnd->x; pY = src + src_stride * src_wnd->y + src_wnd->x + 1; pV = src + src_stride * src_wnd->y + src_wnd->x + 3; break; case GF_PIXEL_YUY2: pY = src + src_stride * src_wnd->y + src_wnd->x; pU = src + src_stride * src_wnd->y + src_wnd->x + 1; pV = src + src_stride * src_wnd->y + src_wnd->x + 3; break; case GF_PIXEL_YVYU: pY = src + src_stride * src_wnd->y + src_wnd->x; pV = src + src_stride * src_wnd->y + src_wnd->x + 1; pU = src + src_stride * src_wnd->y + src_wnd->x + 3; break; default: return; } if (is_planar_yuv(vs->pixel_format)) { u32 i, j; unsigned char *dst_y, *dst_u, *dst_v; dst_y = vs->video_buffer; if (vs->pixel_format == GF_PIXEL_YV12) { dst_v = vs->video_buffer + vs->pitch_y * vs->height; dst_u = vs->video_buffer + 5*vs->pitch_y * vs->height/4; } else { dst_u = vs->video_buffer + vs->pitch_y * vs->height; dst_v = vs->video_buffer + 5*vs->pitch_y * vs->height/4; } for (i=0; i<src_wnd->h; i++) { for (j=0; j<src_wnd->w; j+=2) { *dst_y = * pY; *(dst_y+1) = * (pY+2); dst_y += 2; pY += 4; if (i%2) continue; *dst_u = (*pU + *(pU + src_stride)) / 2; *dst_v = (*pV + *(pV + src_stride)) / 2; dst_u++; dst_v++; pU += 4; pV += 4; } if (i%2) { pU += src_stride; pV += src_stride; } } return; } if (get_yuv_base(src_pf) == get_yuv_base(vs->pixel_format)) { u32 i; for (i=0; i<src_wnd->h; i++) { char *dst = vs->video_buffer + i*vs->pitch_y; pY = src + src_stride * (i+src_wnd->y) + src_wnd->x; memcpy(dst, pY, sizeof(char)*2*src_wnd->w); } return; } base_pf = get_yuv_base(vs->pixel_format); for (i=0; i<src_wnd->h; i++) { char *dst = vs->video_buffer + i*vs->pitch_y; char *y = pY + src_stride * i; char *u = pU + src_stride * i; char *v = pV + src_stride * i; switch (base_pf) { case GF_PIXEL_UYVY: for (j=0; j<src_wnd->w; j+=2) { dst[0] = *u; dst[1] = *y; dst[2] = *v; dst[3] = *(y+2); dst += 4; y+=4; u+=4; v+=4; } break; case GF_PIXEL_YVYU: for (j=0; j<src_wnd->w; j+=2) { dst[0] = *y; dst[1] = *v; dst[2] = *(y+2); dst[3] = *u; dst += 4; y+=4; u+=4; v+=4; } break; case GF_PIXEL_YUY2: for (j=0; j<src_wnd->w; j+=2) { dst[0] = *y; dst[1] = *u; dst[2] = *(y+2); dst[3] = *v; dst += 4; y+=4; u+=4; v+=4; } break; } } }
static void write_yv12_to_yuv(GF_VideoSurface *vs, unsigned char *pY, u32 src_stride, u32 src_pf, u32 src_width, u32 src_height, const GF_Window *src_wnd, u8 *pU, u8 *pV) { if (!pU) { pU = pY + src_stride * src_height; pV = pY + 5*src_stride * src_height/4; } pY = pY + src_stride * src_wnd->y + src_wnd->x; /*because of U and V downsampling by 2x2, working with odd Y offset will lead to a half-line shift between Y and UV components. We therefore force an even Y offset for U and V planes.*/ pU = pU + (src_stride * (src_wnd->y / 2) + src_wnd->x) / 2; pV = pV + (src_stride * (src_wnd->y / 2) + src_wnd->x) / 2; if (is_planar_yuv(vs->pixel_format)) { /*complete source copy*/ if ( (vs->pitch_y == (s32) src_stride) && (src_wnd->w == src_width) && (src_wnd->h == src_height)) { assert(!src_wnd->x); assert(!src_wnd->y); memcpy(vs->video_buffer, pY, sizeof(unsigned char)*src_width*src_height); if (vs->pixel_format == GF_PIXEL_YV12) { memcpy(vs->video_buffer + vs->pitch_y * vs->height, pV, sizeof(unsigned char)*src_width*src_height/4); memcpy(vs->video_buffer + 5 * vs->pitch_y * vs->height/4, pU, sizeof(unsigned char)*src_width*src_height/4); } else { memcpy(vs->video_buffer + vs->pitch_y * vs->height, pU, sizeof(unsigned char)*src_width*src_height/4); memcpy(vs->video_buffer + 5 * vs->pitch_y * vs->height/4, pV, sizeof(unsigned char)*src_width*src_height/4); } } else { u32 i; unsigned char *dst, *src, *dst2, *src2, *dst3, *src3; src = pY; dst = vs->video_buffer; src2 = (vs->pixel_format != GF_PIXEL_YV12) ? pU : pV; dst2 = vs->video_buffer + vs->pitch_y * vs->height; src3 = (vs->pixel_format != GF_PIXEL_YV12) ? pV : pU; dst3 = vs->video_buffer + 5*vs->pitch_y * vs->height/4; for (i=0; i<src_wnd->h; i++) { memcpy(dst, src, src_wnd->w); src += src_stride; dst += vs->pitch_y; if (i<src_wnd->h/2) { memcpy(dst2, src2, src_wnd->w/2); src2 += src_stride/2; dst2 += vs->pitch_y/2; memcpy(dst3, src3, src_wnd->w/2); src3 += src_stride/2; dst3 += vs->pitch_y/2; } } } } else if (get_yuv_base(vs->pixel_format)==GF_PIXEL_UYVY) { u32 i, j; unsigned char *dst, *y, *u, *v; for (i=0; i<src_wnd->h; i++) { y = pY + i*src_stride; u = pU + (i/2) * src_stride/2; v = pV + (i/2) * src_stride/2; dst = vs->video_buffer + i*vs->pitch_y; for (j=0; j<src_wnd->w/2; j++) { *dst = *u; dst++; u++; *dst = *y; dst++; y++; *dst = *v; dst++; v++; *dst = *y; dst++; y++; } } } else if (get_yuv_base(vs->pixel_format)==GF_PIXEL_YUY2) { u32 i, j; unsigned char *dst, *y, *u, *v; for (i=0; i<src_wnd->h; i++) { y = pY + i*src_stride; u = pU + (i/2) * src_stride/2; v = pV + (i/2) * src_stride/2; dst = vs->video_buffer + i*vs->pitch_y; for (j=0; j<src_wnd->w/2; j++) { *dst = *y; dst++; y++; *dst = *u; dst++; u++; *dst = *y; dst++; y++; *dst = *v; dst++; v++; } } } else if (vs->pixel_format==GF_PIXEL_YVYU) { u32 i, j; unsigned char *dst, *y, *u, *v; for (i=0; i<src_wnd->h; i++) { y = pY + i*src_stride; u = pU + (i/2) * src_stride/2; v = pV + (i/2) * src_stride/2; dst = vs->video_buffer + i*vs->pitch_y; for (j=0; j<src_wnd->w/2; j++) { *dst = *y; dst++; y++; *dst = *v; dst++; v++; *dst = *y; dst++; y++; *dst = *u; dst++; u++; } } } }
static void VR_write_yv12_to_yuv(M4VideoSurface *vs, unsigned char *src, u32 src_stride, u32 src_pf, u32 src_width, u32 src_height, M4Window *src_wnd) { unsigned char *pY, *pU, *pV; pY = src; pU = src + src_stride * src_height; pV = src + 5*src_stride * src_height/4; pY = pY + src_stride * src_wnd->y + src_wnd->x; pU = pU + (src_stride * src_wnd->y / 2 + src_wnd->x) / 2; pV = pV + (src_stride * src_wnd->y / 2 + src_wnd->x) / 2; if (is_planar_yuv(vs->pixel_format)) { /*complete source copy*/ if ( (vs->pitch == src_stride) && (src_wnd->w == src_width) && (src_wnd->h == src_height)) { assert(!src_wnd->x); assert(!src_wnd->y); memcpy(vs->video_buffer, pY, sizeof(unsigned char)*src_width*src_height); if (vs->pixel_format == M4PF_YV12) { memcpy(vs->video_buffer + vs->pitch * vs->height, pV, sizeof(unsigned char)*src_width*src_height/4); memcpy(vs->video_buffer + 5 * vs->pitch * vs->height/4, pU, sizeof(unsigned char)*src_width*src_height/4); } else { memcpy(vs->video_buffer + vs->pitch * vs->height, pU, sizeof(unsigned char)*src_width*src_height/4); memcpy(vs->video_buffer + 5 * vs->pitch * vs->height/4, pV, sizeof(unsigned char)*src_width*src_height/4); } } else { u32 i; unsigned char *dst, *src, *dst2, *src2, *dst3, *src3; src = pY; dst = vs->video_buffer; src2 = (vs->pixel_format != M4PF_YV12) ? pU : pV; dst2 = vs->video_buffer + vs->pitch * vs->height; src3 = (vs->pixel_format != M4PF_YV12) ? pV : pU; dst3 = vs->video_buffer + 5*vs->pitch * vs->height/4; for (i=0; i<src_wnd->h; i++) { memcpy(dst, src, src_wnd->w); src += src_stride; dst += vs->pitch; if (i<src_wnd->h/2) { memcpy(dst2, src2, src_wnd->w/2); src2 += src_stride/2; dst2 += vs->pitch/2; memcpy(dst3, src3, src_wnd->w/2); src3 += src_stride/2; dst3 += vs->pitch/2; } } } } else if (vs->pixel_format==M4PF_UYVY) { u32 i, j; unsigned char *dst, *y, *u, *v; for (i=0; i<src_wnd->h; i++) { y = pY + i*src_stride; u = pU + (i/2) * src_stride/2; v = pV + (i/2) * src_stride/2; dst = vs->video_buffer + i*vs->pitch; for (j=0; j<src_wnd->w/2;j++) { *dst = *u; dst++; u++; *dst = *y; dst++; y++; *dst = *v; dst++; v++; *dst = *y; dst++; y++; } } } else if (vs->pixel_format==M4PF_YUY2) { u32 i, j; unsigned char *dst, *y, *u, *v; for (i=0; i<src_wnd->h; i++) { y = pY + i*src_stride; u = pU + (i/2) * src_stride/2; v = pV + (i/2) * src_stride/2; dst = vs->video_buffer + i*vs->pitch; for (j=0; j<src_wnd->w/2;j++) { *dst = *y; dst++; y++; *dst = *u; dst++; u++; *dst = *y; dst++; y++; *dst = *v; dst++; v++; } } } else if (vs->pixel_format==M4PF_YVYU) { u32 i, j; unsigned char *dst, *y, *u, *v; for (i=0; i<src_wnd->h; i++) { y = pY + i*src_stride; u = pU + (i/2) * src_stride/2; v = pV + (i/2) * src_stride/2; dst = vs->video_buffer + i*vs->pitch; for (j=0; j<src_wnd->w/2;j++) { *dst = *y; dst++; y++; *dst = *v; dst++; v++; *dst = *y; dst++; y++; *dst = *u; dst++; u++; } } } }