void gf_es_dispatch_raw_media_au(GF_Channel *ch, char *payload, u32 payload_size, u32 cts) { GF_CompositionMemory *cb; GF_CMUnit *cu; if (!payload || !ch->odm->codec->CB) return; if (!ch->odm->codec->CB->no_allocation) return; cb = ch->odm->codec->CB; cu = gf_cm_lock_input(cb, cts, 1); if (cu) { u32 size = 0; assert(cu->RenderedLength==0); if (cb->UnitSize >= payload_size) { cu->data = payload; size = payload_size; cu->TS = cts; GF_LOG(GF_LOG_DEBUG, GF_LOG_MEDIA, ("[ODM%d] Raw Frame dispatched to CB - TS %d ms\n", ch->odm->OD->objectDescriptorID, cu->TS)); } gf_cm_unlock_input(cb, cu, size, 1); if (ch->BufferOn) { ch->BufferOn = 0; gf_clock_buffer_off(ch->clock); gf_cm_abort_buffering(cb); } /*since the CB is a simple pointer to the input frame, wait until it is released before getting back to the caller module*/ if (size) { gf_sema_wait(ch->odm->raw_frame_sema); assert(cb->output->dataLength == 0); } } }
/*Get a pointer to the next CU buffer*/ static GFINLINE GF_Err LockCompositionUnit(GF_Codec *dec, u32 CU_TS, GF_CMUnit **cu, u32 *cu_size) { if (!dec->CB) return GF_BAD_PARAM; *cu = gf_cm_lock_input(dec->CB, CU_TS, dec->is_reordering); if (! *cu ) return GF_OUT_OF_MEM; *cu_size = dec->CB->UnitSize; return GF_OK; }
void gf_es_dispatch_raw_media_au(GF_Channel *ch, char *payload, u32 payload_size, u32 cts) { u32 now; GF_CompositionMemory *cb; GF_CMUnit *cu; if (!payload || !ch->odm->codec->CB) return; if (!ch->odm->codec->CB->no_allocation) return; now = gf_clock_real_time(ch->clock); if (cts + ch->MinBuffer < now) { if (ch->MinBuffer && (ch->is_raw_channel==2)) { ch->clock->clock_init = 0; gf_clock_set_time(ch->clock, cts); GF_LOG(GF_LOG_WARNING, GF_LOG_MEDIA, ("[ODM%d] Raw Frame dispatched at OTB %d but frame TS is %d ms - adjusting clock\n", ch->odm->OD->objectDescriptorID, now, cts)); } else { GF_LOG(GF_LOG_WARNING, GF_LOG_MEDIA, ("[ODM%d] Raw Frame dispatched at OTB %d but frame TS is %d ms - DROPPING\n", ch->odm->OD->objectDescriptorID, now, cts)); } return; } cb = ch->odm->codec->CB; cu = gf_cm_lock_input(cb, cts, 1); if (cu) { u32 size = 0; assert(cu->RenderedLength==0); if (cb->UnitSize >= payload_size) { cu->data = payload; size = payload_size; cu->TS = cts; GF_LOG(GF_LOG_DEBUG, GF_LOG_MEDIA, ("[ODM%d] Raw Frame dispatched to CB - TS %d ms - OTB %d ms - OTB_drift %d ms\n", ch->odm->OD->objectDescriptorID, cu->TS, gf_clock_real_time(ch->clock), gf_clock_time(ch->clock) )); } gf_cm_unlock_input(cb, cu, size, 1); if (ch->BufferOn) { ch->BufferOn = 0; gf_clock_buffer_off(ch->clock); gf_cm_abort_buffering(cb); } /*since the CB is a simple pointer to the input frame, wait until it is released before getting back to the caller module*/ if (size) { gf_sema_wait(ch->odm->raw_frame_sema); assert(cb->output->dataLength == 0); } } }