static int yw_stop(TCModuleInstance *self) { YWPrivateData *pd = NULL; int verr, aerr; TC_MODULE_SELF_CHECK(self, "stop"); pd = self->userdata; if (pd->fd_vid != -1) { verr = close(pd->fd_vid); if (verr) { tc_log_error(MOD_NAME, "closing video file: %s", strerror(errno)); return TC_ERROR; } y4m_fini_frame_info(&pd->frameinfo); y4m_fini_stream_info(&(pd->streaminfo)); pd->fd_vid = -1; } if (pd->wav != NULL) { aerr = wav_close(pd->wav); if (aerr != 0) { tc_log_error(MOD_NAME, "closing audio file: %s", wav_strerror(wav_last_error(pd->wav))); return TC_ERROR; } pd->wav = NULL; } return TC_OK; }
static int yw_multiplex(TCModuleInstance *self, vframe_list_t *vframe, aframe_list_t *aframe) { ssize_t w_aud = 0, w_vid = 0; YWPrivateData *pd = NULL; TC_MODULE_SELF_CHECK(self, "multiplex"); pd = self->userdata; if (vframe != NULL && vframe->video_len > 0) { uint8_t *planes[3]; int ret = 0; y4m_init_frame_info(&pd->frameinfo); YUV_INIT_PLANES(planes, vframe->video_buf, IMG_YUV420P, pd->width, pd->height); ret = y4m_write_frame(pd->fd_vid, &(pd->streaminfo), &pd->frameinfo, planes); if (ret != Y4M_OK) { tc_log_warn(MOD_NAME, "error while writing video frame: %s", y4m_strerr(ret)); return TC_ERROR; } w_vid = vframe->video_len; } if (aframe != NULL && aframe->audio_len > 0) { w_aud = wav_write_data(pd->wav, aframe->audio_buf, aframe->audio_len); if (w_aud != aframe->audio_len) { tc_log_warn(MOD_NAME, "error while writing audio frame: %s", wav_strerror(wav_last_error(pd->wav))); return TC_ERROR; } } return (int)(w_vid + w_aud); }
static int yw_open_audio(YWPrivateData *pd, const char *filename, vob_t *vob) { WAVError err; int rate; pd->wav = wav_open(filename, WAV_WRITE, &err); if (!pd->wav) { tc_log_error(MOD_NAME, "failed to open audio stream file '%s'" " (reason: %s)", filename, wav_strerror(err)); return TC_ERROR; } rate = (vob->mp3frequency != 0) ?vob->mp3frequency :vob->a_rate; wav_set_bits(pd->wav, vob->dm_bits); wav_set_rate(pd->wav, rate); wav_set_bitrate(pd->wav, vob->dm_chan * rate * vob->dm_bits/8); wav_set_channels(pd->wav, vob->dm_chan); return TC_OK; }
static int yw_open_audio(YWPrivateData *pd, vob_t *vob) { WAVError err; if (!vob->audio_in_file || !strcmp(vob->video_in_file, vob->audio_in_file)) { tc_log_error(MOD_NAME, "missing or bad audio source file," " please specify it"); return(TC_IMPORT_ERROR); } pd->wav = wav_open(vob->audio_in_file, WAV_READ, &err); if (!pd->wav) { tc_log_error(MOD_NAME, "can't open audio source '%s'" " (reason: %s)", vob->audio_in_file, wav_strerror(err)); } else { if (verbose >= TC_DEBUG) { tc_log_info(MOD_NAME, "using audio source: %s", vob->audio_in_file); } } return(TC_IMPORT_OK); }