int tdav_consumer_video_put(tdav_consumer_video_t* self, const void* data, tsk_size_t data_size, const tsk_object_t* proto_hdr) { const trtp_rtp_header_t* rtp_hdr = TRTP_RTP_HEADER(proto_hdr); int ret; if(!self || !data || !self->jitterbuffer || !rtp_hdr){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } tsk_safeobj_lock(self); if(!TMEDIA_JITTER_BUFFER(self->jitterbuffer)->opened){ uint32_t frame_duration = (1000 / TMEDIA_CONSUMER(self)->video.fps); static uint32_t rate = 90000; static uint32_t channels = 1; if((ret = tmedia_jitterbuffer_open(TMEDIA_JITTER_BUFFER(self->jitterbuffer), frame_duration, rate, channels))){ TSK_DEBUG_ERROR("Failed to open jitterbuffer (%d)", ret); tsk_safeobj_unlock(self); return ret; } } ret = tmedia_jitterbuffer_put(TMEDIA_JITTER_BUFFER(self->jitterbuffer), (void*)data, data_size, proto_hdr); tsk_safeobj_unlock(self); return ret; }
/* put data (bytes not shorts) into the jitter buffer (consumers always have ptime of 20ms) */ int tdav_consumer_audio_put(tdav_consumer_audio_t* self, const void* data, tsk_size_t data_size, const tsk_object_t* proto_hdr) { int ret; if(!self || !data || !self->jitterbuffer){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } tsk_safeobj_lock(self); if(!TMEDIA_JITTER_BUFFER(self->jitterbuffer)->opened){ uint32_t rate = TMEDIA_CONSUMER(self)->audio.out.rate ? TMEDIA_CONSUMER(self)->audio.out.rate : TMEDIA_CONSUMER(self)->audio.in.rate; uint32_t channels = TMEDIA_CONSUMER(self)->audio.out.channels ? TMEDIA_CONSUMER(self)->audio.out.channels : tmedia_defaults_get_audio_channels_playback(); if((ret = tmedia_jitterbuffer_open(self->jitterbuffer, TMEDIA_CONSUMER(self)->audio.ptime, rate, channels))){ TSK_DEBUG_ERROR("Failed to open jitterbuffer (%d)", ret); tsk_safeobj_unlock(self); return ret; } } ret = tmedia_jitterbuffer_put(self->jitterbuffer, (void*)data, data_size, proto_hdr); tsk_safeobj_unlock(self); return ret; }