int opengl_close() { int ret; if (!opengl.started) return 0; glc_log(opengl.glc, GLC_DEBUG, "opengl", "closing"); if (opengl.capturing) gl_capture_stop(opengl.gl_capture); gl_capture_destroy(opengl.gl_capture); if (opengl.unscaled) { if (lib.running) { if ((ret = glc_util_write_end_of_stream(opengl.glc, opengl.unscaled))) { glc_log(opengl.glc, GLC_ERROR, "opengl", "can't write end of stream: %s (%d)", strerror(ret), ret); return ret; } } else ps_buffer_cancel(opengl.unscaled); if (opengl.convert_ycbcr_420jpeg) { ycbcr_process_wait(opengl.ycbcr); ycbcr_destroy(opengl.ycbcr); } else { scale_process_wait(opengl.scale); scale_destroy(opengl.scale); } } else if (lib.running) { if ((ret = glc_util_write_end_of_stream(opengl.glc, opengl.buffer))) { glc_log(opengl.glc, GLC_ERROR, "opengl", "can't write end of stream: %s (%d)", strerror(ret), ret); return ret; } } else ps_buffer_cancel(opengl.buffer); if (opengl.unscaled) { ps_buffer_destroy(opengl.unscaled); free(opengl.unscaled); } return 0; }
int audio_capture_data(audio_capture_t audio_capture, void *data, size_t size) { glc_message_header_t msg_hdr; glc_audio_data_header_t audio_hdr; int ret; if (!(audio_capture->flags & AUDIO_CAPTURE_CAPTURING)) return 0; if (audio_capture->flags & AUDIO_CAPTURE_CFG_CHANGED) { if ((ret = audio_capture_write_cfg(audio_capture))) return ret; audio_capture->flags &= ~AUDIO_CAPTURE_CFG_CHANGED; } if (!(audio_capture->flags & AUDIO_CAPTURE_IGNORE_TIME)) audio_capture->time = glc_state_time(audio_capture->glc); msg_hdr.type = GLC_MESSAGE_AUDIO_DATA; audio_hdr.id = audio_capture->id; /* should be set to valid one */ audio_hdr.size = size; audio_hdr.time = audio_capture->time; if (audio_capture->flags & AUDIO_CAPTURE_IGNORE_TIME) audio_capture->time += ((glc_utime_t) size * (glc_utime_t) 1000000) / (glc_utime_t) (audio_capture_frames_to_bytes(audio_capture, 1) * audio_capture->rate); if ((ret = ps_packet_open(&audio_capture->packet, PS_PACKET_WRITE))) goto err; if ((ret = ps_packet_write(&audio_capture->packet, &msg_hdr, sizeof(glc_message_header_t)))) goto err; if ((ret = ps_packet_write(&audio_capture->packet, &audio_hdr, sizeof(glc_audio_data_header_t)))) goto err; if ((ret = ps_packet_write(&audio_capture->packet, data, size))) goto err; if ((ret = ps_packet_close(&audio_capture->packet))) goto err; return 0; err: ps_buffer_cancel(audio_capture->target); glc_state_set(audio_capture->glc, GLC_STATE_CANCEL); glc_log(audio_capture->glc, GLC_ERROR, "audio_capture", "can't write audio data to buffer"); glc_log(audio_capture->glc, GLC_ERROR, "audio_capture", "%s (%d)", strerror(ret), ret); return ret; }
void gl_capture_error(gl_capture_t gl_capture, int err) { glc_log(gl_capture->glc, GLC_ERROR, "gl_capture", "%s (%d)", strerror(err), err); /* stop capturing */ if (gl_capture->flags & GL_CAPTURE_CAPTURING) gl_capture_stop(gl_capture); /* cancel glc */ glc_state_set(gl_capture->glc, GLC_STATE_CANCEL); if (gl_capture->to) ps_buffer_cancel(gl_capture->to); }
int audio_capture_write_cfg(audio_capture_t audio_capture) { glc_message_header_t hdr; glc_audio_format_message_t fmt_msg; int ret = 0; if (!audio_capture->id) glc_state_audio_new(audio_capture->glc, &audio_capture->id, &audio_capture->state_audio); hdr.type = GLC_MESSAGE_AUDIO_FORMAT; fmt_msg.id = audio_capture->id; fmt_msg.flags = audio_capture->format_flags; fmt_msg.rate = audio_capture->rate; fmt_msg.channels = audio_capture->channels; fmt_msg.format = audio_capture->format; if ((ret = ps_packet_open(&audio_capture->packet, PS_PACKET_WRITE))) goto err; if ((ret = ps_packet_write(&audio_capture->packet, &hdr, sizeof(glc_message_header_t)))) goto err; if ((ret = ps_packet_write(&audio_capture->packet, &fmt_msg, sizeof(glc_audio_format_message_t)))) goto err; if ((ret = ps_packet_close(&audio_capture->packet))) goto err; return 0; err: glc_state_set(audio_capture->glc, GLC_STATE_CANCEL); ps_buffer_cancel(audio_capture->target); glc_log(audio_capture->glc, GLC_ERROR, "audio_capture", "can't write audio stream configuration to buffer"); glc_log(audio_capture->glc, GLC_ERROR, "audio_capture", "%s (%d)", strerror(ret), ret); return ret; }