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; }
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; }