void gf_cm_unlock_input(GF_CompositionMemory *cb, GF_CMUnit *cu, u32 cu_size, Bool codec_reordering) { /*nothing dispatched, ignore*/ if (!cu_size || (!cu->data && !cu->frame && !cb->pY) ) { if (cu->frame) { cu->frame->Release(cu->frame); cu->frame = NULL; } cu->dataLength = 0; cu->TS = 0; return; } gf_odm_lock(cb->odm, 1); // assert(cu->frame); if (codec_reordering) { cb->input = cb->input->next; } else { cu = gf_cm_reorder_unit(cb, cu, codec_reordering); assert(cu); } if (cu) { /*FIXME - if the CU already has data, this is spatial scalability so same num buffers*/ if (!cu->dataLength) cb->UnitCount += 1; cu->dataLength = cu_size; cu->RenderedLength = 0; /*turn off buffering for audio - this must be done now rather than when fetching first output frame since we're not sure output is fetched (Switch node, ...)*/ if ( (cb->Status == CB_BUFFER) && (cb->UnitCount >= cb->Capacity) ) { /*done with buffering*/ cb->Status = CB_BUFFER_DONE; //for audio, turn off buffering now. For video, we will wait for the first frame to be drawn if (cb->odm->codec->type == GF_STREAM_AUDIO) cb_set_buffer_off(cb); } //new FPS regulation doesn't need this signaling #if 0 /*since a new CU is here notify the compositor*/ if ((cb->odm->codec->type==GF_STREAM_VISUAL) && cb->odm->mo && cb->odm->mo->num_open) { gf_term_invalidate_compositor(cb->odm->term); } #endif } gf_odm_lock(cb->odm, 0); }
void gf_cm_unlock_input(GF_CompositionMemory *cb, GF_CMUnit *cu, u32 cu_size, Bool codec_reordering) { /*nothing dispatched, ignore*/ if (!cu_size) { cu->dataLength = 0; cu->TS = 0; return; } gf_odm_lock(cb->odm, 1); if (cu->TS < cb->input->TS) cu = cu; if (codec_reordering) { cb->input = cb->input->next; } else { cu = gf_cm_reorder_unit(cb, cu, codec_reordering); assert(cu); } if (cu) { /*FIXME - if the CU already has data, this is spatial scalability so same num buffers*/ if (!cu->dataLength) cb->UnitCount += 1; cu->dataLength = cu_size; cu->RenderedLength = 0; /*turn off buffering - this must be done now rather than when fetching first output frame since we're not sure output is fetched (Switch node, ...)*/ if ( (cb->Status == CB_BUFFER) && (cb->UnitCount >= cb->Capacity) ) { /*done with buffering, signal to the clock (ONLY ONCE !)*/ cb->Status = CB_BUFFER_DONE; gf_clock_buffer_off(cb->odm->codec->ck); cb->odm->codec->ck->data_timeout = 0; GF_LOG(GF_LOG_DEBUG, GF_LOG_SYNC, ("[SyncLayer] ODM%d: buffering off at %d (nb buffering on clock: %d)\n", cb->odm->OD->objectDescriptorID, gf_term_get_time(cb->odm->term), cb->odm->codec->ck->Buffering)); gf_term_service_media_event(cb->odm->parentscene->root_od, GF_EVENT_MEDIA_CANPLAY); } /*since a new CU is here notify the compositor*/ if ((cb->odm->codec->type==GF_STREAM_VISUAL) && cb->odm->mo && cb->odm->mo->num_open) { gf_term_invalidate_compositor(cb->odm->term); } } gf_odm_lock(cb->odm, 0); }