⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuyvtoy4m.c

📁 Motion JPEG编解码器源代码
💻 C
字号:
/* * $Id: yuyvtoy4m.c,v 1.1 2005/04/23 03:31:14 sms00 Exp $ * * A simple progam that can be used to convert 'yuyv' (also known as yuv2) * 4:2:2 packed into 4:2:2 planar format.  Additional packings may be added * in the future BUT some of those are 'full range' rather than 'video range'! * Apple calls this 'yuvs' since the bytes within each 16bit word are swapped. * * The other moderately common 4:2:2 packing is UYVY - a simple byte flip within * each 16bit word.  Since there's no way for the program to autodetect which * packing is used the '-k' option is provided for the user.  If wild/crazy colors * are seen the chances are good that -k is needed ;) * * Used to convert YUY2/YUYV/YUVS to YUV4MPEG2 which is the format used by * mpeg2enc from the mjpeg-tools suite. * * This is strictly a filter, the use is in a pipeline such as the following * which catenates the raw 4:2:2 packed (yuyv) images from a ieee1394 digital  * camera into a stream, repacks to 4:2:2 planar, and converts to 4:2:0 before * encoding.  Obviously other steps, such as altering the frame rate, etc will * be done.   * * The default sample aspect ratio for is square (1:1) because the anticipated use * of this program is with stills from IIDC cameras. * * cat *.raw | yuyvtoy4m -i p -w 1280 -h 960 -a 1:1 -r 24:1 | \ *       y4mscaler -O chromass=420_mpeg2 | mpeg2enc ... * * NOTE: Obviously when catenating multiple files together they ALL must have  *       the same attributes (dimensions,  interlacing, etc)!*/#ifdef	HAVE_CONFIG_H#include "config.h"#else#define HAVE_STDINT_H#endif#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include "yuv4mpeg.h"extern	char	*__progname;static	void	usage(void);intmain(int argc, char **argv)	{	int	sts, c, width = 0, height = 0, frame_len, i, yuyv = 1;	y4m_ratio_t	rate_ratio = y4m_fps_FILM;	y4m_ratio_t	aspect_ratio = y4m_sar_SQUARE;	int		interlace = Y4M_ILACE_NONE;	u_char	*yuv[3], *input_frame, *Y_p, *Cr_p, *Cb_p, *p;	y4m_stream_info_t ostream;	y4m_frame_info_t oframe;	opterr = 0;	if	(argc == 1)		usage();	while	((c = getopt(argc, argv, "w:h:r:i:a:")) != EOF)		{		switch	(c)			{			case	'k':				yuyv = 0;				break;			case	'a':				sts = y4m_parse_ratio(&aspect_ratio, optarg);				if	(sts != Y4M_OK)					mjpeg_error_exit1("Invalid aspect: %s",						optarg);				break;			case	'w':				width = atoi(optarg);				break;			case	'h':				height = atoi(optarg);				break;			case	'r':				sts = y4m_parse_ratio(&rate_ratio, optarg);				if	(sts != Y4M_OK)					mjpeg_error_exit1("Invalid rate: %s", optarg);				break;			case	'i':				switch	(optarg[0])					{					case	'p':						interlace = Y4M_ILACE_NONE;						break;					case	't':						interlace = Y4M_ILACE_TOP_FIRST;						break;					case	'b':						interlace = Y4M_ILACE_BOTTOM_FIRST;						break;					default:						usage();					}				break;			case	'?':			default:				usage();			}		}	if	(width <= 0)		mjpeg_error_exit1("Invalid or unspecified Width: %d", width);	if	(height <= 0)		mjpeg_error_exit1("Invalid or unspecified Height: %d", height);	y4m_accept_extensions(1);	y4m_init_stream_info(&ostream);	y4m_init_frame_info(&oframe);	y4m_si_set_width(&ostream, width);	y4m_si_set_height(&ostream, height);	y4m_si_set_interlace(&ostream, interlace);	y4m_si_set_framerate(&ostream, rate_ratio);	y4m_si_set_sampleaspect(&ostream, aspect_ratio);	y4m_si_set_chroma(&ostream, Y4M_CHROMA_422);	yuv[0] = malloc(y4m_si_get_plane_length(&ostream, 0));	yuv[1] = malloc(y4m_si_get_plane_length(&ostream, 1));	yuv[2] = malloc(y4m_si_get_plane_length(&ostream, 2));	if	(yuv[0] == NULL || yuv[1] == NULL || yuv[2] == NULL)		mjpeg_error_exit1("Could not malloc memory for 4:2:2 planes");	frame_len = y4m_si_get_framelength(&ostream);	input_frame = malloc(frame_len);	if	(input_frame == NULL)		mjpeg_error_exit1("Could not malloc memory for input frame");	y4m_write_stream_header(fileno(stdout), &ostream);	while	(y4m_read(fileno(stdin), input_frame, frame_len) == Y4M_OK)		{		Y_p = yuv[0];		Cb_p = yuv[1];		Cr_p = yuv[2];		p = input_frame;		if	(yuyv)	/* YUYV (YUY2) */			{			for	(i = 0; i < frame_len; i += 4)				{				*Y_p++ = *p++;				*Cb_p++ = *p++;				*Y_p++ = *p++;				*Cr_p++ = *p++;				}			}		else		/* UYVY */			{			for	(i = 0; i < frame_len; i += 4)				{				*Cb_p++ = *p++;				*Y_p++ = *p++;				*Cr_p++ = *p++;				*Y_p++ = *p++;				}			}		y4m_write_frame(fileno(stdout), &ostream, &oframe, yuv);		}	free(yuv[0]);	free(yuv[1]);	free(yuv[2]);	free(input_frame);	y4m_fini_stream_info(&ostream);	y4m_fini_frame_info(&oframe);	exit(0);	}static void usage()	{	fprintf(stderr, "%s repacks YUYV (YUY2) and UYVY 4:2:2 streams into 4:2:2 planar YUV4MPEG2 streams\n", __progname);	fprintf(stderr, "usage: -w width -h height [-k] [-a pixel aspect] [-i p|t|b] -r rate\n");	fprintf(stderr, "  Interlace codes [-i X]: p (none) t (top first) b (bottom first) (p)\n");	fprintf(stderr, "  Rate (as ratio) [-r N:M] (24:1)\n");	fprintf(stderr, "  Pixel aspect (as ratio) [-a N:M] (1:1)\n");	fprintf(stderr, "  Interpret data as UYVY instead of YUYV [-k] (false)\n");	fprintf(stderr, "NO DEFAULT for width or height!\n");	fprintf(stderr, "\n");	exit(1);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -