void gf_db_unit_del(GF_DBUnit *db) { if (!db) return; if (db->next) gf_db_unit_del(db->next); if (db->data) free(db->data); free(db); }
/*reset channel*/ static void Channel_Reset(GF_Channel *ch, Bool for_start) { gf_es_lock(ch, 1); ch->IsClockInit = 0; ch->au_sn = 0; ch->pck_sn = 0; ch->stream_state = 1; ch->IsRap = 0; ch->IsEndOfStream = 0; ch->skip_carousel_au = 0; if (for_start) { gf_es_lock(ch, 0); return; } ch->ts_offset = 0; ch->seed_ts = 0; ch_buffer_off(ch); if (ch->buffer) gf_free(ch->buffer); ch->buffer = NULL; ch->len = ch->allocSize = 0; gf_db_unit_del(ch->AU_buffer_first); ch->AU_buffer_first = ch->AU_buffer_last = NULL; ch->AU_Count = 0; ch->BufferTime = 0; ch->NextIsAUStart = 1; ch->first_au_fetched = 0; if (ch->AU_buffer_pull) { ch->AU_buffer_pull->data = NULL; gf_db_unit_del(ch->AU_buffer_pull); ch->AU_buffer_pull = NULL; } gf_es_lock(ch, 0); }
/*destroy channel*/ void gf_es_del(GF_Channel *ch) { Channel_Reset(ch, 0); if (ch->AU_buffer_pull) { ch->AU_buffer_pull->data = NULL; gf_db_unit_del(ch->AU_buffer_pull); } if (ch->ipmp_tool) gf_modules_close_interface((GF_BaseInterface *) ch->ipmp_tool); if (ch->mx) gf_mx_del(ch->mx); gf_free(ch); }
void gf_db_unit_del(GF_DBUnit *db) { if (!db) return; if (db->next) gf_db_unit_del(db->next); db->next = NULL; if (db->data) { /* memset(db->data, 0, db->dataLength); */ gf_free(db->data); } db->dataLength = 0; db->data = NULL; gf_free(db); }
void gf_es_drop_au(GF_Channel *ch) { GF_DBUnit *au; if (ch->is_pulling) { if (ch->AU_buffer_pull) { gf_term_channel_release_sl_packet(ch->service, ch); ch->AU_buffer_pull->data = NULL; ch->AU_buffer_pull->dataLength = 0; } ch->first_au_fetched = 1; return; } /*lock the channel before touching the queue*/ gf_es_lock(ch, 1); if (!ch->AU_buffer_first) { gf_es_lock(ch, 0); return; } ch->first_au_fetched = 1; au = ch->AU_buffer_first; ch->AU_buffer_first = au->next; au->next = NULL; gf_db_unit_del(au); ch->AU_Count -= 1; if (!ch->AU_Count && ch->AU_buffer_first) { ch->AU_buffer_first = NULL; } if (!ch->AU_buffer_first) ch->AU_buffer_last = NULL; Channel_UpdateBufferTime(ch); /*if we get under our limit, rebuffer EXCEPT WHEN EOS is signaled*/ if (!ch->IsEndOfStream && Channel_NeedsBuffering(ch, 1)) { ch_buffer_on(ch); gf_term_service_media_event(ch->odm, GF_EVENT_MEDIA_WAITING); } /*unlock the channel*/ gf_es_lock(ch, 0); }
void gf_es_reset_buffers(GF_Channel *ch) { gf_mx_p(ch->mx); if (ch->buffer) gf_free(ch->buffer); ch->buffer = NULL; ch->len = ch->allocSize = 0; gf_db_unit_del(ch->AU_buffer_first); ch->AU_buffer_first = ch->AU_buffer_last = NULL; ch->AU_Count = 0; if (ch->odm->codec && ch->odm->codec->CB) gf_cm_reset(ch->odm->codec->CB); ch->BufferTime = 0; gf_mx_v(ch->mx); }