// This callback will be called for each AVB transmit interval. Commonly this will be // 4000 or 8000 times per second. bool openavbIntfLoggerTxCB(media_q_t *pMediaQ) { AVB_TRACE_ENTRY(AVB_TRACE_INTF_DETAIL); if (pMediaQ) { pvt_data_t *pPvtData = pMediaQ->pPvtIntfInfo; if (!pPvtData) { AVB_LOG_ERROR("Private interface module data not allocated."); return FALSE; } media_q_item_t *pMediaQItem = openavbMediaQHeadLock(pMediaQ); if (pMediaQItem) { U32 dataLen = avbLogGetMsg(pMediaQItem->pPubData, pMediaQItem->itemSize); if (dataLen) { pMediaQItem->dataLen = dataLen; openavbAvtpTimeSetToWallTime(pMediaQItem->pAvtpTime); openavbMediaQHeadPush(pMediaQ); AVB_TRACE_EXIT(AVB_TRACE_INTF_DETAIL); return TRUE; } else { openavbMediaQHeadUnlock(pMediaQ); } } else { AVB_TRACE_EXIT(AVB_TRACE_INTF_DETAIL); return FALSE; // Media queue full } } AVB_TRACE_EXIT(AVB_TRACE_INTF_DETAIL); return FALSE; }
bool openavbIntfMpeg2tsGstTxCB(media_q_t *pMediaQ) { AVB_TRACE_ENTRY(AVB_TRACE_INTF_DETAIL); if (!pMediaQ) { AVB_TRACE_EXIT(AVB_TRACE_INTF_DETAIL); return FALSE; } pvt_data_t *pPvtData = pMediaQ->pPvtIntfInfo; if (!pPvtData) { AVB_LOG_ERROR("Private interface module data not allocated."); return FALSE; } if (!pPvtData->appsink) { AVB_TRACE_EXIT(AVB_TRACE_INTF_DETAIL); return FALSE; } media_q_item_t *pMediaQItem; GstAlBuf *txBuf; while (g_atomic_int_get(&pPvtData->nWaiting) > 0) { // Get a mediaQItem to hold the buffered data pMediaQItem = openavbMediaQHeadLock(pMediaQ); if (!pMediaQItem) { IF_LOG_INTERVAL(1000) AVB_LOG_ERROR("Media queue full"); break; } /* Retrieve the buffer */ txBuf = gst_al_pull_buffer(pPvtData->appsink); if (txBuf) { g_atomic_int_add(&pPvtData->nWaiting, -1); if ( GST_AL_BUF_SIZE(txBuf) > pMediaQItem->itemSize ) { AVB_LOGF_ERROR("GStreamer buffer too large (size=%d) for mediaQ item (dataLen=%d)", GST_AL_BUF_SIZE(txBuf), pMediaQItem->itemSize); pMediaQItem->dataLen = 0; openavbMediaQHeadUnlock(pMediaQ); } else { memcpy(pMediaQItem->pPubData, GST_AL_BUF_DATA(txBuf), GST_AL_BUF_SIZE(txBuf)); pMediaQItem->dataLen = GST_AL_BUF_SIZE(txBuf); openavbAvtpTimeSetToWallTime(pMediaQItem->pAvtpTime); openavbMediaQHeadPush(pMediaQ); } gst_al_buffer_unref(txBuf); } else { AVB_LOG_ERROR("GStreamer buffer pull failed"); // assume the pipeline is empty g_atomic_int_set(&pPvtData->nWaiting, 0); // abandon the mediaq item pMediaQItem->dataLen = 0; openavbMediaQHeadUnlock(pMediaQ); // and get out break; } } AVB_TRACE_EXIT(AVB_TRACE_INTF_DETAIL); return TRUE; }