void cs_kill(CSSession *cs) { if (!cs) return; /* queue_message will not be called since it's unregistered before cs_kill is called */ pthread_mutex_destroy(cs->queue_mutex); if ( cs->audio_encoder ) opus_encoder_destroy(cs->audio_encoder); if ( cs->audio_decoder ) opus_decoder_destroy(cs->audio_decoder); if ( cs->capabilities & cs_VideoDecoding ) vpx_codec_destroy(&cs->v_decoder); if ( cs->capabilities & cs_VideoEncoding ) vpx_codec_destroy(&cs->v_encoder); jbuf_free(cs->j_buf); buffer_free(cs->vbuf_raw); free(cs->frame_buf); LOGGER_DEBUG("Terminated codec state: %p", cs); free(cs); }
void ac_kill(ACSession *ac) { if (!ac) return; opus_encoder_destroy(ac->encoder); opus_decoder_destroy(ac->decoder); jbuf_free(ac->j_buf); pthread_mutex_destroy(ac->queue_mutex); LOGGER_DEBUG("Terminated audio handler: %p", ac); free(ac); }
void ac_kill(ACSession *ac) { if (!ac) { return; } opus_encoder_destroy(ac->encoder); opus_decoder_destroy(ac->decoder); jbuf_free((struct JitterBuffer *)ac->j_buf); pthread_mutex_destroy(ac->queue_mutex); LOGGER_DEBUG(ac->log, "Terminated audio handler: %p", ac); free(ac); }
ACSession *ac_new(Logger *log, ToxAV *av, uint32_t friend_number, toxav_audio_receive_frame_cb *cb, void *cb_data) { ACSession *ac = (ACSession *)calloc(sizeof(ACSession), 1); if (!ac) { LOGGER_WARNING(log, "Allocation failed! Application might misbehave!"); return NULL; } if (create_recursive_mutex(ac->queue_mutex) != 0) { LOGGER_WARNING(log, "Failed to create recursive mutex!"); free(ac); return NULL; } int status; ac->decoder = opus_decoder_create(48000, 2, &status); if (status != OPUS_OK) { LOGGER_ERROR(log, "Error while starting audio decoder: %s", opus_strerror(status)); goto BASE_CLEANUP; } if (!(ac->j_buf = jbuf_new(3))) { LOGGER_WARNING(log, "Jitter buffer creaton failed!"); opus_decoder_destroy(ac->decoder); goto BASE_CLEANUP; } ac->log = log; /* Initialize encoders with default values */ ac->encoder = create_audio_encoder(log, 48000, 48000, 2); if (ac->encoder == NULL) { goto DECODER_CLEANUP; } ac->le_bit_rate = 48000; ac->le_sample_rate = 48000; ac->le_channel_count = 2; ac->ld_channel_count = 2; ac->ld_sample_rate = 48000; ac->ldrts = 0; /* Make it possible to reconfigure straight away */ /* These need to be set in order to properly * do error correction with opus */ ac->lp_frame_duration = 120; ac->lp_sampling_rate = 48000; ac->lp_channel_count = 1; ac->av = av; ac->friend_number = friend_number; ac->acb.first = cb; ac->acb.second = cb_data; return ac; DECODER_CLEANUP: opus_decoder_destroy(ac->decoder); jbuf_free((struct JitterBuffer *)ac->j_buf); BASE_CLEANUP: pthread_mutex_destroy(ac->queue_mutex); free(ac); return NULL; }
CSSession *cs_new(const ToxAvCSettings *cs_self, const ToxAvCSettings *cs_peer, uint32_t jbuf_size, int has_video) { CSSession *cs = calloc(sizeof(CSSession), 1); if (!cs) { LOGGER_WARNING("Allocation failed! Application might misbehave!"); return NULL; } if (create_recursive_mutex(cs->queue_mutex) != 0) { LOGGER_WARNING("Failed to create recursive mutex!"); free(cs); return NULL; } if ( !(cs->j_buf = jbuf_new(jbuf_size)) ) { LOGGER_WARNING("Jitter buffer creaton failed!"); goto error; } cs->audio_encoder_bitrate = cs_self->audio_bitrate; cs->audio_encoder_sample_rate = cs_self->audio_sample_rate; cs->audio_encoder_channels = cs_self->audio_channels; cs->audio_encoder_frame_duration = cs_self->audio_frame_duration; cs->audio_decoder_bitrate = cs_peer->audio_bitrate; cs->audio_decoder_sample_rate = cs_peer->audio_sample_rate; cs->audio_decoder_channels = cs_peer->audio_channels; cs->audio_decoder_frame_duration = cs_peer->audio_frame_duration; cs->capabilities |= ( 0 == init_audio_encoder(cs) ) ? cs_AudioEncoding : 0; cs->capabilities |= ( 0 == init_audio_decoder(cs) ) ? cs_AudioDecoding : 0; if ( !(cs->capabilities & cs_AudioEncoding) || !(cs->capabilities & cs_AudioDecoding) ) goto error; if ((cs->support_video = has_video)) { cs->max_video_frame_size = MAX_VIDEOFRAME_SIZE; cs->video_frame_piece_size = VIDEOFRAME_PIECE_SIZE; cs->capabilities |= ( 0 == init_video_encoder(cs, cs_self->max_video_width, cs_self->max_video_height, cs_self->video_bitrate) ) ? cs_VideoEncoding : 0; cs->capabilities |= ( 0 == init_video_decoder(cs) ) ? cs_VideoDecoding : 0; if ( !(cs->capabilities & cs_VideoEncoding) || !(cs->capabilities & cs_VideoDecoding) ) goto error; if ( !(cs->frame_buf = calloc(cs->max_video_frame_size, 1)) ) goto error; if ( !(cs->split_video_frame = calloc(cs->video_frame_piece_size + VIDEOFRAME_HEADER_SIZE, 1)) ) goto error; if ( !(cs->vbuf_raw = buffer_new(VIDEO_DECODE_BUFFER_SIZE)) ) goto error; } return cs; error: LOGGER_WARNING("Error initializing codec session! Application might misbehave!"); pthread_mutex_destroy(cs->queue_mutex); if ( cs->audio_encoder ) opus_encoder_destroy(cs->audio_encoder); if ( cs->audio_decoder ) opus_decoder_destroy(cs->audio_decoder); if (has_video) { if ( cs->capabilities & cs_VideoDecoding ) vpx_codec_destroy(&cs->v_decoder); if ( cs->capabilities & cs_VideoEncoding ) vpx_codec_destroy(&cs->v_encoder); buffer_free(cs->vbuf_raw); free(cs->frame_buf); free(cs->split_video_frame); } jbuf_free(cs->j_buf); free(cs); return NULL; }