コード例 #1
0
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;
}
コード例 #2
0
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);
}
コード例 #3
0
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;
}
コード例 #4
0
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);
}