Exemple #1
0
int opengl_start(ps_buffer_t *buffer)
{
	if (opengl.started)
		return EINVAL;

	opengl.buffer = buffer;

	/* init unscaled buffer if it is needed */
	if ((opengl.scale_factor != 1.0) | opengl.convert_ycbcr_420jpeg) {
		/* if scaling is enabled, it is faster to capture as GL_BGRA */
		gl_capture_set_pixel_format(opengl.gl_capture, GL_BGRA);

		ps_bufferattr_t attr;
		ps_bufferattr_init(&attr);
		ps_bufferattr_setsize(&attr, opengl.unscaled_size);
		opengl.unscaled = (ps_buffer_t *) malloc(sizeof(ps_buffer_t));
		ps_buffer_init(opengl.unscaled, &attr);

		if (opengl.convert_ycbcr_420jpeg) {
			ycbcr_init(&opengl.ycbcr, opengl.glc);
			ycbcr_set_scale(opengl.ycbcr, opengl.scale_factor);
			ycbcr_process_start(opengl.ycbcr, opengl.unscaled, buffer);
		} else {
			scale_init(&opengl.scale, opengl.glc);
			scale_set_scale(opengl.scale, opengl.scale_factor);
			scale_process_start(opengl.scale, opengl.unscaled, buffer);
		}

		gl_capture_set_buffer(opengl.gl_capture, opengl.unscaled);
	} else {
		gl_capture_set_pixel_format(opengl.gl_capture, GL_BGR);
		gl_capture_set_buffer(opengl.gl_capture, opengl.buffer);
	}

	opengl.started = 1;
	return 0;
}
Exemple #2
0
int export_yuv4mpeg(struct play_s *play)
{
	/*
	 Export yuv4mpeg uses following pipeline:

	 file -(uncompressed_buffer)->     reads data from stream file
	 unpack -(uncompressed_buffer)->   decompresses lzo/quicklz packets
	 scale -(scale)->           does rescaling
	 color -(color)->           applies color correction
	 ycbcr -(ycbcr)->           does conversion to Y'CbCr (if necessary)
	 yuv4mpeg                   writes yuv4mpeg stream
	*/

	ps_bufferattr_t attr;
	ps_buffer_t uncompressed_buffer, compressed_buffer,
		    ycbcr_buffer, color_buffer, scale_buffer;
	yuv4mpeg_t yuv4mpeg;
	ycbcr_t ycbcr;
	scale_t scale;
	unpack_t unpack;
	color_t color;
	int ret = 0;

	if ((ret = ps_bufferattr_init(&attr)))
		goto err;

	/* buffers */
	if ((ret = ps_bufferattr_setsize(&attr, play->compressed_size)))
		goto err;
	if ((ret = ps_buffer_init(&compressed_buffer, &attr)))
		goto err;

	if ((ret = ps_bufferattr_setsize(&attr, play->uncompressed_size)))
		goto err;
	if ((ret = ps_buffer_init(&uncompressed_buffer, &attr)))
		goto err;
	if ((ret = ps_buffer_init(&color_buffer, &attr)))
		goto err;
	if ((ret = ps_buffer_init(&ycbcr_buffer, &attr)))
		goto err;
	if ((ret = ps_buffer_init(&scale_buffer, &attr)))
		goto err;

	if ((ret = ps_bufferattr_destroy(&attr)))
		goto err;

	/* initialize filters */
	if ((ret = unpack_init(&unpack, &play->glc)))
		goto err;
	if ((ret = ycbcr_init(&ycbcr, &play->glc)))
		goto err;
	ycbcr_set_levels(ycbcr, play->tv_levels);
	if ((ret = scale_init(&scale, &play->glc)))
		goto err;
	if (play->scale_width && play->scale_height)
		scale_set_size(scale, play->scale_width, play->scale_height);
	else
		scale_set_scale(scale, play->scale_factor);
	if ((ret = color_init(&color, &play->glc)))
		goto err;
	if (play->override_color_correction)
		color_override(color, play->brightness, play->contrast,
			       play->red_gamma, play->green_gamma, play->blue_gamma);
	if ((ret = yuv4mpeg_init(&yuv4mpeg, &play->glc)))
		goto err;
	yuv4mpeg_set_fps(yuv4mpeg, play->fps);
	yuv4mpeg_set_stream_id(yuv4mpeg, play->export_video_id);
	yuv4mpeg_set_interpolation(yuv4mpeg, play->interpolate);
	yuv4mpeg_set_filename(yuv4mpeg, play->export_filename_format);

	/* construct the pipeline */
	if ((ret = unpack_process_start(unpack, &compressed_buffer, &uncompressed_buffer)))
		goto err;
	if ((ret = scale_process_start(scale, &uncompressed_buffer, &scale_buffer)))
		goto err;
	if ((ret = color_process_start(color, &scale_buffer, &color_buffer)))
		goto err;
	if ((ret = ycbcr_process_start(ycbcr, &color_buffer, &ycbcr_buffer)))
		goto err;
	if ((ret = yuv4mpeg_process_start(yuv4mpeg, &ycbcr_buffer)))
		goto err;

	/* feed it with data */
	if ((ret = file_read(play->file, &compressed_buffer)))
		goto err;

	/* threads will do the dirty work... */
	if ((ret = yuv4mpeg_process_wait(yuv4mpeg)))
		goto err;
	if ((ret = color_process_wait(color)))
		goto err;
	if ((ret = scale_process_wait(scale)))
		goto err;
	if ((ret = ycbcr_process_wait(ycbcr)))
		goto err;
	if ((ret = unpack_process_wait(unpack)))
		goto err;

	unpack_destroy(unpack);
	ycbcr_destroy(ycbcr);
	scale_destroy(scale);
	color_destroy(color);
	yuv4mpeg_destroy(yuv4mpeg);

	ps_buffer_destroy(&compressed_buffer);
	ps_buffer_destroy(&uncompressed_buffer);
	ps_buffer_destroy(&color_buffer);
	ps_buffer_destroy(&scale_buffer);
	ps_buffer_destroy(&ycbcr_buffer);

	return 0;
err:
	fprintf(stderr, "exporting yuv4mpeg failed: %s (%d)\n", strerror(ret), ret);
	return ret;
}