Exemple #1
0
void pool_close(POOL_T *pPool, int wait_for_ret) {

  TIME_VAL tv0 = timer_GetTime();

  if(!pPool) {
    return;
  }

  if(pPool->pInUse) {
    pPool->destroy_onempty = 1;

    if(wait_for_ret) {
      LOG(X_DEBUG("pool_close %s waiting for resources to be returned"), (pPool->descr ? pPool->descr : ""));
      while(pPool->pInUse) {
        if(wait_for_ret > 0 && (timer_GetTime() - tv0) / TIME_VAL_MS > wait_for_ret) {
          LOG(X_WARNING("pool_close %s aborting wait for resources to be returned"), (pPool->descr ? pPool->descr : ""));
          break;
        }
        usleep(50000);
      }
      LOG(X_DEBUG("pool_close %s done waiting for resources to be returned"), (pPool->descr ? pPool->descr : ""));
    } else {
      LOG(X_DEBUG("pool_close %s delaying deallocation until resources returned"), 
        (pPool->descr ? pPool->descr : ""));
      return;
    }

  }

  pool_free(pPool);

}
Exemple #2
0
int mediadb_mkdirfull(const char *root, const char *path) {

  size_t idxprev;
  struct stat st;
  size_t sz = 0;
  size_t len;
  char buf[VSX_MAX_PATH_LEN];

//  fprintf(stdout, "mkdirfull '%s' '%s'\n", root, path);

  if(!path) {
    return -1;
  }

  if(root) {
    sz = strlen(root);
  }

  buf[sizeof(buf) - 1] = '\0';
  idxprev = sz;
  len = strlen(path);
 
  for(; sz < len && sz < sizeof(buf); sz++) {
    if(path[sz] == DIR_DELIMETER)  {

      memset(buf, 0, sizeof(buf));
      strncpy(buf, path, sz);

//fprintf(stdout, "stat '%s'\n", buf);
      if(strlen(buf) > 0 && fileops_stat(buf, &st) != 0) {
        LOG(X_DEBUG("Creating dir '%s'"), buf);
        if(fileops_MkDir(buf, S_IRWXU | S_IRWXG | S_IRWXO ) < 0) {
          LOG(X_ERROR("Unable to create dir '%s'"), buf);
          return -1;
        }
      }

      while(path[sz] == DIR_DELIMETER) {
        sz++;
      }
      idxprev = sz;
//fprintf(stdout, "after'%s'\n", &path[sz]);
    }
  }
  

  if(sz > idxprev && fileops_stat(path, &st) != 0) {
    LOG(X_DEBUG("Creating dir '%s'"), path);
    if(fileops_MkDir(path, S_IRWXU | S_IRWXG | S_IRWXO ) < 0) {
      LOG(X_ERROR("Unable to create dir '%s'"), path);
      return -1;
    }
  }

  return 0;
}
Exemple #3
0
static H264_NAL_T *getNextVclSlice(STREAM_H264_T *pStreamH264) {

  if(pStreamH264->loop && pStreamH264->idxNal >= pStreamH264->pH264->lastFrameId) {

    LOG(X_DEBUG("Looping H.264 stream"));
    pStreamH264->idxNal = 0;
  }
  //fprintf(stderr, "GETNEXTVCLSLICE loop:%d, idxNal [%d/%d], pSlice: 0x%x 0x%x\n", pStreamH264->loop, pStreamH264->idxNal, pStreamH264->pH264->lastFrameId, pStreamH264->frame.pSlice, pStreamH264->frame.pSlice ? pStreamH264->frame.pSlice->hdr : 0);

  if(pStreamH264->frame.pSlice && 
     ((H264_USE_DIRECT_READ(pStreamH264->pH264) && pStreamH264->frame.pSlice->content.pnext) ||
     //(((pStreamH264->pH264->pMkvCtxt || pStreamH264->pH264->pMp4Ctxt) && pStreamH264->frame.pSlice->content.pnext) ||
      (
       //pStreamH264->frame.pSlice == &pStreamH264->audSlice ||
       pStreamH264->frame.pSlice == &pStreamH264->spsSlice ||
       pStreamH264->frame.pSlice == &pStreamH264->ppsSlice)
     )) {

    pStreamH264->frame.pSlice = (H264_NAL_T *) pStreamH264->frame.pSlice->content.pnext;
    if(pStreamH264->idxNal == 0) {
      pStreamH264->idxNal++;
    }
    //fprintf(stderr, "RETURNING NEXT SLICE IN FR 0x%x\n", pStreamH264->frame.pSlice->hdr);
    return pStreamH264->frame.pSlice;
  }

  return  (H264_NAL_T *) h264_cbGetNextAnnexBSample(pStreamH264->pH264, 
                                                    pStreamH264->idxNal++, 0);
}
int cbOnPkt_silk(void *pUserData, const COLLECT_STREAM_PKTDATA_T *pPkt) {
  CAPTURE_CBDATA_SP_T *pSp = (CAPTURE_CBDATA_SP_T *) pUserData;
  const unsigned char *pData = pPkt ? pPkt->payload.pData : NULL;
  unsigned int len = pPkt ? PKTCAPLEN(pPkt->payload) : 0;
  CAPTURE_STORE_CBDATA_T cbData;
  int queueFr = 0;
  int rc = 0;

  if(pSp == NULL) {
    return -1;
  } else if(!pPkt || !pPkt->payload.pData) {
    // Packet was lost
    LOG(X_WARNING("RTP SILK lost packet, last seq:%u, last ts:%u"), pSp->lastPktSeq, pSp->lastPktTs);
    pSp->spFlags |= (CAPTURE_SP_FLAG_DAMAGEDFRAME | CAPTURE_SP_FLAG_PREVLOST);
    return 0;
  }

  VSX_DEBUG_RTP(
    LOG(X_DEBUG("RTP - rtp-recv-silk len:%d seq:%u ts:%u(%.3f) ts0:%u(%.3f, dlta:%.3f), mrk:%d ssrc:0x%x "
                   "flags:0x%x pQ:0x%x"),
       PKTCAPLEN(pPkt->payload), pPkt->u.rtp.seq, pPkt->u.rtp.ts, PTSF(pPkt->u.rtp.ts),
       pSp->pStream->ts0,
       (pSp->pStream->clockHz > 0 ? ((double)pSp->pStream->ts0/pSp->pStream->clockHz) : 0),
       (pSp->pStream->clockHz > 0 ? ((double)(pPkt->u.rtp.ts - pSp->pStream->ts0)/pSp->pStream->clockHz) : 0),
       (pPkt->u.rtp.marksz & PKTDATA_RTP_MASK_MARKER)?1:0,
       pSp->pStream->hdr.key.ssrc, pSp->spFlags, pSp->pCapAction && pSp->pCapAction->pQueue ? 1 : 0);
    if(pPkt && PKTCAPLEN(pPkt->payload) > 0) {
      LOGHEX_DEBUG(pPkt->payload.pData, MIN(16, PKTCAPLEN(pPkt->payload)));
    }
  );
Exemple #5
0
int cbOnPkt_vp8(void *pUserData, const COLLECT_STREAM_PKTDATA_T *pPkt) {
  int rc = 0;
  CAPTURE_CBDATA_SP_T *pSp = (CAPTURE_CBDATA_SP_T *) pUserData;
  CAPTURE_STORE_CBDATA_T cbData;
  int queueFr = 0;

  if(pSp == NULL) {
    return -1;
  } else if(!pPkt || !pPkt->payload.pData) {
    // Packet was lost
    LOG(X_WARNING("RTP VP8 lost packet, last seq:%u, last ts:%u"), pSp->lastPktSeq, pSp->lastPktTs);
    pSp->spFlags |= (CAPTURE_SP_FLAG_DAMAGEDFRAME | CAPTURE_SP_FLAG_PREVLOST);
    return 0;
  }

  VSX_DEBUG(
    //VSX_DEBUGLOG_TIME
    LOG(X_DEBUG("rtp-recv-vp8 len:%d seq:%u ts:%u(%.3f) ts0:%u(%.3f, dlta:%.3f), mrk:%d ssrc:0x%x "
                   "flags:0x%x pQ:0x%x"),
       PKTCAPLEN(pPkt->payload), pPkt->u.rtp.seq, pPkt->u.rtp.ts, PTSF(pPkt->u.rtp.ts),
       pSp->pStream->ts0,
       (pSp->pStream->clockHz > 0 ? ((double)pSp->pStream->ts0/pSp->pStream->clockHz) : 0),
       (pSp->pStream->clockHz > 0 ? ((double)(pPkt->u.rtp.ts - pSp->pStream->ts0)/pSp->pStream->clockHz) : 0),
       (pPkt->u.rtp.marksz & PKTDATA_RTP_MASK_MARKER)?1:0,
       pSp->pStream->hdr.key.ssrc, pSp->spFlags, pSp->pCapAction && pSp->pCapAction->pQueue ? 1 : 0);
    if(pPkt && PKTCAPLEN(pPkt->payload) > 0) {
      LOGHEX_DEBUG(pPkt->payload.pData, MIN(16, PKTCAPLEN(pPkt->payload)));
    }
    //fprintf(stderr, "tmpFrame.buf.idx:%d\n", pSp->pCapAction->tmpFrameBuf.idx);
  );
Exemple #6
0
static int stream_net_av_reset(STREAM_PES_T *pPes) {
  STREAM_AV_DATA_T *pData = NULL;
  unsigned int idx;

  LOG(X_DEBUG("A/V input stream reset"));

  for(idx = 0; idx < 2; idx++) {

    if(idx == 0) {
      pData = &pPes->vid;
    } else {
      pData = &pPes->aud;
    }

    if(pData->pDataSrc) {
      pktqueue_reset((PKTQUEUE_T *) pData->pDataSrc->pCbData, 1);
    }

    xcode_resetdata(pData->pXcodeData);

    pData->numFrames = 0;
    memset(&pData->curPesTm, 0, sizeof(pData->curPesTm));
    memset(&pData->prevPesTm, 0, sizeof(pData->prevPesTm));
    pData->lastQWrIdx = 0;
    if(pData->pHaveSeqStart) {
      *pData->pHaveSeqStart = 0;
    }

  }

  return 0;
} 
Exemple #7
0
static int extractGenericTrak(const MP4_CONTAINER_T *pMp4, 
                              const MP4_TRAK_T *pMp4BoxSet, 
                              const char *path, 
                              float fStart,
                              float fDuration) {

  FILE_STREAM_T fStreamOut;
  CBDATA_WRITE_GENERIC_SAMPLE_T genericDescr;
  uint64_t startHz = 0;
  uint64_t durationHz = 0;
  int rc = 0;

  durationHz = (uint64_t) (fDuration * pMp4BoxSet->pMdhd->timescale);
  startHz = (uint64_t) (fStart * pMp4BoxSet->pMdhd->timescale);

  if((fStreamOut.fp = fileops_Open(path, O_RDWR | O_CREAT)) == FILEOPS_INVALID_FP) {
    LOG(X_CRITICAL("Unable to open file for writing: %s"), path);
    return -1;
  }
  fStreamOut.offset = 0;

  LOG(X_DEBUG("Extracting raw media from %s"), pMp4->pStream->cbGetName(pMp4->pStream));

  genericDescr.pStreamOut = &fStreamOut;
  rc = mp4_readSamplesFromTrack(pMp4BoxSet, pMp4->pStream, writeGenericSample_mp4wrap, &genericDescr,
                                startHz, durationHz);

  fileops_Close(fStreamOut.fp);

  return rc;
}
Exemple #8
0
int metafile_close(META_FILE_T *pMetaFile) {
  int rc = 0;
  ENTRY_IGNORE_T *pIgnore, *pIgnoreNext;
  ENTRY_META_DESCRIPTION_T *pDesc, *pDescNext;
  
  if(pMetaFile) {

    VSX_DEBUG_METAFILE( LOG(X_DEBUG("META - metafile_close for file: '%s'"), pMetaFile->filestr) );

    pIgnore = pMetaFile->pignoreList;
    while(pIgnore) {
      pIgnoreNext = pIgnore->pnext;
      free(pIgnore); 
      pIgnore = pIgnoreNext;
    }

    pDesc = pMetaFile->pDescriptionList;
    while(pDesc) {
      pDescNext = pDesc->pnext;
      free(pDesc); 
      pDesc = pDescNext;
    }

    pMetaFile->pignoreList = NULL;
    pMetaFile->pDescriptionList = NULL;
  }

  return rc;
}
Exemple #9
0
int dtls_netsock_setmtu(NETIO_SOCK_T *pnetsock, int mtu) {

  if(!pnetsock || !pnetsock->ssl.pCtxt) {
    return -1;
  } else if(mtu <= 0) {
    return 0;
  } else {
#if defined(__linux__) 

    if(mtu < 228) {
      LOG(X_ERROR("Cannot set DTLS MTU %d below minimum %d"), 228);
      return -1;
    }

    pthread_mutex_lock(&((STREAM_DTLS_CTXT_T *) pnetsock->ssl.pDtlsCtxt)->mtx);

    LOG(X_DEBUG("Setting DTLS MTU %d (netsock: 0x%x)"), mtu, pnetsock);
    // openSSL MTU may be broken on Mac, but may work on Linux
    //SSL_set_options(pnetsock->ssl.pCtxt, SSL_OP_NO_QUERY_MTU); //TODO: setting this makes the socket mtu 0, and the ssl/d1_both.c:268 assert crashes the app 
    SSL_set_mtu(pnetsock->ssl.pCtxt, mtu);
    //SSL_set_mtu(pnetsock->ssl.pCtxt, mtu - 28);

    pthread_mutex_unlock(&((STREAM_DTLS_CTXT_T *) pnetsock->ssl.pDtlsCtxt)->mtx);

#endif // (__linux__) 
    return 0;
  }

}
Exemple #10
0
int procdb_delete(SYS_PROCLIST_T *pProcs, const char *name, const char *id, int lock) {
  int rc = -1;
  SYS_PROC_T *pProc = NULL;
  SYS_PROC_T *pProcPrev = NULL;

  if(!pProcs || !name) {
    return -1;
  }

  if(!id) {
    id = "";
  }

  if(lock) {
    pthread_mutex_lock(&pProcs->mtx); 
  }

  pProc = pProcs->procs;

  while(pProc) {

   if(!strcasecmp(pProc->name, name) && !strcasecmp(pProc->id, id)) {
   
      if(pProcPrev) {
        pProcPrev->pnext = pProc->pnext;
      }
      if(pProcs->procs == pProc) {
        pProcs->procs = pProc->pnext;
      }

      LOG(X_DEBUG("Removing process '%s' pid:%d flags:0x%x"), 
          pProc->name, pProc->pid, pProc->flags);

      if(pProcs->activeInstances > 0) {
        pProcs->activeInstances--;
      }
      if(pProc->isXcoded && pProcs->activeXcodeInstances > 0) {
        pProcs->activeXcodeInstances--;
      }

      free(pProc);
      rc = 0;
      break;

    } else { 
      pProcPrev = pProc;
      pProc = pProc->pnext;
    }
  }

  if(lock) {
    pthread_mutex_unlock(&pProcs->mtx); 
  }

  if(rc != 0) {
    LOG(X_ERROR("Failed to remove process '%s'"), pProc->name);
  }

  return rc;
}
Exemple #11
0
float stream_net_h264_jump(STREAM_H264_T *pStreamH264, float fStartSec, int syncframe) {

  uint64_t desiredOffset = 0;
  H264_NAL_T *pNal = NULL;
  float fOffsetActual;

  if(!pStreamH264 || fStartSec < 0) {
    return -1;
  }

  desiredOffset = (uint64_t) (fStartSec * pStreamH264->pH264->clockHzOverride);

  pStreamH264->idxNal = 0;
  pNal = (H264_NAL_T *) h264_cbGetNextAnnexBSample(
                               pStreamH264->pH264, pStreamH264->idxNal++, -1);

  while(pNal && pNal->content.playOffsetHz + pNal->content.playDurationHz <
        desiredOffset) {

    pNal = (H264_NAL_T *) h264_cbGetNextAnnexBSample(
                               pStreamH264->pH264, pStreamH264->idxNal++, -1);
  }

  if(pNal) {

    if(syncframe) {
      h264_moveToPriorSync(pStreamH264->pH264);
    }
    pNal = (H264_NAL_T *) h264_cbGetNextAnnexBSample(
                             pStreamH264->pH264, pStreamH264->idxNal++, 1);
  }

  if(!pNal) {
    LOG(X_WARNING("h.264 stream jump to %.2f out of range %.2f (%u)"), 
                  fStartSec, (double)pStreamH264->pH264->lastPlayOffsetHz /
                  pStreamH264->pH264->clockHzOverride, 
                  pStreamH264->pH264->pNalsLastVcl->content.frameId);
    return -1;
  }

  fOffsetActual = (float) ((double)pNal->content.playOffsetHz /
                                 pStreamH264->pH264->clockHzOverride);

  pStreamH264->frame.numSlices = 1;
  pStreamH264->frame.szTot = pNal->content.sizeRd;
  pStreamH264->frame.frameId = pNal->content.frameId;
  pStreamH264->frame.pFileStream = pNal->content.pStreamIn;
  pStreamH264->frame.idxInSlice = pStreamH264->frame.szTot;
  pStreamH264->frame.idxSlice = 1;
  pStreamH264->frame.pSlice = pNal;

  if(pStreamH264->includeAnnexBHdr) {
    pStreamH264->frame.idxInSlice += 4;
  }

  LOG(X_DEBUG("h.264 stream playout moved to frame %d actual:%.1fs (%.1fs) file:0x%llx"), 
       pNal->content.frameId, fOffsetActual, fStartSec, pNal->content.fileOffset);

  return fOffsetActual;
}
Exemple #12
0
RTSP_SESSION_T *rtspsrv_newSession(STREAM_RTSP_SESSIONS_T *pRtsp, int rtpmux, int rtcpmux) {
  RTSP_SESSION_T *pSes = NULL;
  unsigned int idx;

  if(!pRtsp) {
    return NULL;
  }

  pthread_mutex_lock(&pRtsp->mtx);

  for(idx = 0; idx < pRtsp->max; idx++) {

    if(!pRtsp->psessions[idx].inuse) {

      pSes = &pRtsp->psessions[idx];

      rtspsrv_initSession(pRtsp, pSes);

      if(rtsp_alloc_listener_ports(pSes, pRtsp->staticLocalPort, rtpmux, rtcpmux, 1, 1) < 0) {
        memset(pSes, 0, sizeof(RTSP_SESSION_T));
        return NULL;
      }
/*
      if(pRtsp->staticLocalPort) {
        //
        // Some RTSP firewalls / SBCs require source port to always be in a range 6970 - 9999
        // or even 6970-6971 only
        //
        pSes->vid.localports[0] = pRtsp->staticLocalPort;
        pSes->vid.localports[1] = pSes->vid.localports[0] + 1;
        pSes->aud.localports[0] = pSes->vid.localports[0] + 0;
        pSes->aud.localports[1] = pSes->aud.localports[0] + 1;
      } else {
        //
        // Create contiguous series of ports
        // Some media clients/servers may not work properly with different
        // video / audio port ranges, 
        //
        pSes->vid.localports[0] = net_getlocalmediaport(2);
        pSes->vid.localports[1] = pSes->vid.localports[0] + 1;
        pSes->aud.localports[0] = pSes->vid.localports[0] + 2;
        pSes->aud.localports[1] = pSes->aud.localports[0] + 1;
      }
*/
      pRtsp->numActive++;
      pSes->inuse = 1;

      LOG(X_DEBUG("Created RTSP %ssession %s Active: %d / %d"), 
            ((pSes->sessionType & RTSP_SESSION_TYPE_INTERLEAVED) ? "(interleaved) " : ""),
             pSes->sessionid, pRtsp->numActive, pRtsp->max);
      break;
    }
  }

  pthread_mutex_unlock(&pRtsp->mtx);


  return pSes;
}
Exemple #13
0
void *avc_calloc(size_t count, size_t size) {
  void *p;

  if((p = calloc(count, size)) == NULL) {
    LOG(X_CRITICAL("Failed to calloc %d x %d"), count, size);
  }

  VSX_DEBUG_MEM( LOG(X_DEBUG("MEM - avc_calloc %d x %d = %d at 0x%x"), count, size, count * size, p); );
Exemple #14
0
int net_connect_tmt(SOCKET sock, const struct sockaddr *psa, unsigned int mstmt) {
  int rc = 0;
  struct timeval tv;
  fd_set fdsetRd, fdsetWr;
  char tmp[128];
  int try = 0;

  if(sock == INVALID_SOCKET || !psa) {
    return -1;
  } else if(mstmt == 0) {
    return net_connect(sock, psa);
  }

  VSX_DEBUG_NET( LOG(X_DEBUG("NET - net_connect family: %d, fd: %d, trying to %s:%d with timeout %d ms"),
             psa->sa_family, sock, FORMAT_NETADDR(*psa, tmp, sizeof(tmp)), ntohs(PINET_PORT(psa)), mstmt) );

  if((rc = net_setsocknonblock(sock, 1)) < 0) {
    return rc;
  }

  do {

    if((rc = connect(sock, psa, (socklen_t) INET_SIZE(*psa))) != 0) {

      if(errno == EINPROGRESS) {
        tv.tv_sec = (mstmt / 1000);
        tv.tv_usec = (mstmt % 1000) * 1000;

        FD_ZERO(&fdsetRd);
        FD_SET(sock, &fdsetRd);
        FD_ZERO(&fdsetWr);
        FD_SET(sock, &fdsetWr);

        if((rc = select(sock + 1, &fdsetRd, &fdsetWr, NULL, &tv)) > 0) {
          // call connect again to see if it was succesful 
          try++;
          rc = -1;
        } else if(rc == 0) {
          // timeout expired
          rc = -1;
          errno = ETIMEDOUT;
          break;
        } else {
          // select error
          break;
        }

      } else if(errno == EISCONN && try > 0) {
        // already connected
        rc = 0;
        break;
      } else {
        // connect failure
        rc = -1;
        break;
      }

    } // end of if((rc = connect...
Exemple #15
0
STREAM_STATS_T *stream_monitor_createattach(STREAM_STATS_MONITOR_T *pMonitor,
        const struct sockaddr_in *psaRemote,
        STREAM_METHOD_T method,
        STREAM_MONITOR_ABR_TYPE_T abrEnabled) {
    unsigned int numWr = 1;
    unsigned int numRd = 1;
    STREAM_STATS_T *pStats;

    if(!pMonitor || !pMonitor->active || !psaRemote) {
        return NULL;
    }

    //
    // If this monitor is for use with Adaptive Bitrate control then we don't care about stream
    // data sources which do not account for the bitrate we intend to control.
    //
    if(pMonitor->pAbr && abrEnabled == STREAM_MONITOR_ABR_NONE) {
        return NULL;
    }

    if(abrEnabled == STREAM_MONITOR_ABR_ENABLED) {
        LOG(X_DEBUG("ABR is enabled for output -> %s://%s:%d"),
            devtype_methodstr(method), inet_ntoa(psaRemote->sin_addr), htons(psaRemote->sin_port));
    }

    if(method == STREAM_METHOD_UDP) {

        //
        // payload over UDP w/o RTP header (MPEG-2 ts)
        //
        numRd = 0;

    } else if(method == STREAM_METHOD_UDP_RTP) {

        //
        // We try to account RTP and RTCP output independently
        //
        numWr = 2;

        //
        // For RTP output there is no TCP flow based in/out queing disparity
        //
        numRd = 0;
    }

    if(!(pStats = stream_stats_create(psaRemote, numWr, numRd, pMonitor->rangeMs1, pMonitor->rangeMs2))) {
        return NULL;
    }

    pStats->method = method;
    pStats->abrEnabled = abrEnabled;

    if(stream_monitor_attach(pMonitor, pStats) < 0) {
        stream_stats_destroy(&pStats, NULL);
    }

    return pStats;
}
Exemple #16
0
void sig_handler(int sig) {

  LOG(X_DEBUG("Deleting shared memory"));
  xcode_ipc_close(g_pXcodeIpc);

  signal(sig, SIG_DFL);

  exit(0);
}
Exemple #17
0
static int mp4_extractAvcVid(const MP4_CONTAINER_T *pMp4, const char *path, 
                      float fStart, float fDuration) {
  FILE_STREAM_T fStreamOut;
  MP4_TRAK_AVCC_T mp4BoxSet;
  AVCC_CBDATA_WRITE_SAMPLE_T avcDescr;
  uint64_t startHz = 0;
  uint64_t durationHz = 0;
  uint32_t sampledelta = 0;
  int rc = 0;

  if(!pMp4|| !pMp4->pStream || pMp4->pStream == FILEOPS_INVALID_FP) {
    return -1;
  }

  LOG(X_DEBUG("Extracting h.264 video from %s"), pMp4->pStream->cbGetName(pMp4->pStream));

  if(mp4_initAvcCTrack(pMp4, &mp4BoxSet) < 0) {
    return -1;
  }

  durationHz = (uint64_t) (fDuration * mp4BoxSet.tk.pMdhd->timescale);
  startHz = (uint64_t) (fStart * mp4BoxSet.tk.pMdhd->timescale);

  if((fStreamOut.fp = fileops_Open(path, O_RDWR | O_CREAT)) == FILEOPS_INVALID_FP) {
    LOG(X_CRITICAL("Unable to open file for writing: %s"), path);
    return -1;
  }
  fStreamOut.offset = 0;

  if((sampledelta = mp4_getSttsSampleDelta(&mp4BoxSet.tk.pStts->list)) == 0) {
    LOG(X_WARNING("Unable to get video sample timing from stts w/ %d entries"), 
                   mp4BoxSet.tk.pStts->list.entrycnt);
  }

  rc = avcc_writeSPSPPS(&fStreamOut, &mp4BoxSet.pAvcC->avcc,
                         sampledelta, mp4BoxSet.tk.pMdhd->timescale);
    
  
  if(rc >= 0) {
    avcDescr.lenNalSzField = mp4BoxSet.pAvcC->avcc.lenminusone + 1;
    avcDescr.pStreamOut = &fStreamOut;

    if(avcDescr.lenNalSzField <= 0 || avcDescr.lenNalSzField > 4) {
      LOG(X_ERROR("Invalid avcC start frame length field: %u"), avcDescr.lenNalSzField);
      fileops_Close(fStreamOut.fp);
      return -1;
    }

    rc = mp4_readSamplesFromTrack(&mp4BoxSet.tk, pMp4->pStream,  
                   avcc_cbWriteSample_mp4wrap, &avcDescr, startHz, durationHz);
  }

  fileops_Close(fStreamOut.fp);

  return rc;
}
Exemple #18
0
static int flvsrv_init_aud_aac(CODEC_AUD_CTXT_T *pCtxtA, const uint8_t *pAdtsHdr) {
  CODEC_AUD_CTXT_AAC_T *pCtxtAac = &pCtxtA->codecCtxt.aac;
  int rc;

  memset(pCtxtAac, 0, sizeof(CODEC_AUD_CTXT_AAC_T));


  if(pCtxtA->pStreamerCfg && !pCtxtA->pStreamerCfg->xcode.aud.common.cfgDo_xcode &&
     XCODE_AUD_UDATA_PTR(&pCtxtA->pStreamerCfg->xcode)->u.aac.descr.sp.init) {

    LOG(X_DEBUG("Loading aac sequence start from source media"));

    memcpy(&pCtxtAac->adtsFrame.sp, &XCODE_AUD_UDATA_PTR(&pCtxtA->pStreamerCfg->xcode)->u.aac.descr.sp,
           sizeof(pCtxtAac->adtsFrame.sp));

    aac_encodeADTSHdr(pCtxtAac->adtsHdr, sizeof(pCtxtAac->adtsHdr), &pCtxtAac->adtsFrame.sp, 0);

  } else {

    LOG(X_DEBUG("Loading aac sequence start from stream ADTS header"));

    if(aac_decodeAdtsHdr(pAdtsHdr, 7, &pCtxtAac->adtsFrame) < 0) {
      return -1;
    }
    memcpy(pCtxtAac->adtsHdr, pAdtsHdr, 7);

  }

  if((rc = esds_encodeDecoderSp((uint8_t *) pCtxtAac->spbuf, sizeof(pCtxtAac->spbuf),
    &pCtxtAac->adtsFrame.sp)) <= 0) {
    return -1;
  }

  pCtxtA->ctxt.clockHz = esds_getFrequencyVal(ESDS_FREQ_IDX(pCtxtAac->adtsFrame.sp));
  pCtxtA->ctxt.channels = pCtxtAac->adtsFrame.sp.channelIdx;
  pCtxtA->ctxt.pstartHdrs = pCtxtAac->spbuf;
  pCtxtA->ctxt.startHdrsLen = rc;

  //fprintf(stderr, "init_aud_aac haveExtFreqIdx:%d, %dHz\n", pCtxtAac->adtsFrame.sp.haveExtFreqIdx, esds_getFrequencyVal(ESDS_FREQ_IDX(pCtxtAac->adtsFrame.sp))); avc_dumpHex(stderr, pCtxtA->ctxt.pstartHdrs, pCtxtA->ctxt.startHdrsLen, 1);

  return 0;
}
Exemple #19
0
int net_recvnb(SOCKET sock, unsigned char *buf, unsigned int len, 
                      unsigned int mstmt, int peek, int *pclosed) {
  struct timeval tv;
  fd_set fdsetRd;
  int rc;
  int sockflags = 0;

#if !defined(__APPLE__) && !defined(WIN32)
  sockflags = MSG_NOSIGNAL;
#endif // __APPLE__

  if(sock == INVALID_SOCKET) {
    return -1;
  }

  if(peek) {
    sockflags |= MSG_PEEK;
  }

  if(pclosed) {
    *pclosed = 0;
  }

  tv.tv_sec = (mstmt / 1000);
  tv.tv_usec = (mstmt % 1000) * 1000;

  FD_ZERO(&fdsetRd);
  FD_SET(sock, &fdsetRd);

  if((rc = select(sock + 1, &fdsetRd, NULL, NULL, &tv)) > 0) {

    if((rc = recv(sock, (void *) buf, len, sockflags)) < 0) {
      LOG(X_ERROR("recv nonblock %d, sockflags: 0x%x returned %d "ERRNO_FMT_STR), 
          len, sockflags, rc, ERRNO_FMT_ARGS);
    } else if(rc == 0) {
      LOG(X_WARNING("recv nonblock %d - connection has been closed."), len);
      if(pclosed) {
        *pclosed = 1;
      }
      // Do not return 0, since that is what select will return if timeout has expired
      return -1;
    } else {
      VSX_DEBUG_NET( LOG(X_DEBUG("NET - net_recvnb %s %d/%d bytes, fd: %d"), peek ? "peeked" : "got", rc, len, sock) );
    }

  } else if(rc == 0) {
    //fprintf(stderr, "TMT EXPIRED sock:%d tv:%d,%d, mstmt:%d\n", sock, tv.tv_sec, tv.tv_usec, mstmt);
    // timeout expired
  } else {
    LOG(X_ERROR("select socket:%d returned: %d"), sock, rc);
  }

  return rc;
}
Exemple #20
0
static int mp4_extractAacAud(const MP4_CONTAINER_T *pMp4, const char *path, 
                      float fStart, float fDuration) {
  FILE_STREAM_T fStreamOut;
  MP4_TRAK_MP4A_T mp4BoxSet;
  ESDS_CBDATA_WRITE_SAMPLE_T esdsDescr;
  unsigned char buf[4096];
  uint64_t startHz = 0;
  uint64_t durationHz = 0;
  int rc = 0;

  if(!pMp4|| !pMp4->pStream || pMp4->pStream == FILEOPS_INVALID_FP) {
    return -1;
  }

  LOG(X_DEBUG("Extracting aac audio from %s"), pMp4->pStream->cbGetName(pMp4->pStream));

  esdsDescr.bs.buf = buf;
  esdsDescr.bs.sz = sizeof(buf);
  esdsDescr.bs.idx = 0;

  if(mp4_initMp4aTrack(pMp4, &mp4BoxSet) < 0) {
    return -1;
  }

  if(mp4BoxSet.pEsds->config.objtypeid != ESDS_OBJTYPE_MP4A) {
    LOG(X_ERROR("Unsupported mp4a esds object type descriptor: %u"), 
                mp4BoxSet.pEsds->config.objtypeid);
    return -1;
  } else if(esds_decodeDecoderSp(mp4BoxSet.pEsds->specific.startcodes, 
        (mp4BoxSet.pEsds->specific.type.length > sizeof(mp4BoxSet.pEsds->specific.startcodes) ?
        sizeof(mp4BoxSet.pEsds->specific.startcodes) : mp4BoxSet.pEsds->specific.type.length), 
        &esdsDescr.decoderCfg) != 0) {
    LOG(X_ERROR("Failed to decode mp4a esds decoder specific data for type descriptor: %u"), 
                mp4BoxSet.pEsds->config.type.descriptor);
    return -1;
  }

  durationHz = (uint64_t) (fDuration * mp4BoxSet.tk.pMdhd->timescale);
  startHz = (uint64_t) (fStart * mp4BoxSet.tk.pMdhd->timescale);

  if((fStreamOut.fp = fileops_Open(path, O_RDWR | O_CREAT)) == FILEOPS_INVALID_FP) {
    LOG(X_CRITICAL("Unable to open file for writing: %s"), path);
    return -1;
  }
  fStreamOut.offset = 0;

  esdsDescr.pStreamOut = &fStreamOut;
  rc = mp4_readSamplesFromTrack(&mp4BoxSet.tk, pMp4->pStream, esds_cbWriteSample_mp4wrap, 
                                &esdsDescr, startHz, durationHz);

  fileops_Close(fStreamOut.fp);

  return rc;
}
Exemple #21
0
int dtls_netsock_setclient(NETIO_SOCK_T *pnetsock, int client) {
  int rc = 0; 

  if(!pnetsock || !(pnetsock->flags & NETIO_FLAG_SSL_DTLS) || !pnetsock->ssl.pCtxt) {
    return -1;
  }

  if(client) {
    LOG(X_DEBUG("DTLS handshake SSL_set_connect_state"));
    SSL_set_connect_state(pnetsock->ssl.pCtxt);
    pnetsock->flags &= ~NETIO_FLAG_SSL_DTLS_SERVER;
  } else {
    LOG(X_DEBUG("DTLS handshake SSL_set_accept_state"));
    SSL_set_accept_state(pnetsock->ssl.pCtxt);
    pnetsock->flags |= NETIO_FLAG_SSL_DTLS_SERVER;
  }

  rc = 0;

  return rc;
}
Exemple #22
0
static int check_status(SYS_PROC_T *pProc) {
  HTTP_STATUS_T httpStatus;
  unsigned char buf[2048];
  unsigned int szdata = sizeof(buf);
  const char *page = NULL;
  char host[256];
  char tmp[64];
  PROC_STATUS_RESP_DATA_T status;

  snprintf(host, sizeof(host), "http://127.0.0.1:%d", MGR_GET_PORT_STATUS(pProc->startPort));

  VSX_DEBUG_MGR( LOG(X_DEBUG("MGR - Sending local status command: '%s' to: %s"), VSX_STATUS_URL, host); );
Exemple #23
0
int rtmp_create_chunksz(RTMP_CTXT_T *pRtmp) {
  int rc;
  const unsigned int hdrlen = 12;

  if((rc = rtmp_create_hdr(&pRtmp->out.buf[pRtmp->out.idx], 
            RTMP_STREAM_IDX_CTRL, 0, 4, RTMP_CONTENT_TYPE_CHUNKSZ, 0, hdrlen)) < 0) {
    return rc;
  }

  *((uint32_t *) &pRtmp->out.buf[pRtmp->out.idx + rc]) = htonl(pRtmp->chunkSzOut);
  pRtmp->out.idx += (rc + 4);

  VSX_DEBUG_RTMP(LOG(X_DEBUG("RTMP - rtmp_create_chunksz: %d"), pRtmp->chunkSzOut); ); 
Exemple #24
0
char *metafile_find(const char *pathmedia, 
                    char *pathbuf, 
                    unsigned int szpathbuf,
                    int *ploaddefault) {
  int sz;
  struct stat st;
  int loaddefault = 0;

  if(!pathmedia) {
  }

  if(ploaddefault) {
    loaddefault = *ploaddefault;
    *ploaddefault = 0;
  }

  VSX_DEBUG_METAFILE( LOG(X_DEBUG("META - metafile_find pathmedia: '%s', loaddefault: %d"), 
                         pathmedia, loaddefault));

  //
  // Check if the media resource is actually a meta file
  //
  if(metafile_isvalidFile(pathmedia)) {
    return (char *) pathmedia;
  }

  //
  // Try to load the metafile for the media resource
  //
  snprintf(pathbuf, szpathbuf, "%s%s", pathmedia, METAFILE_EXT);
  if(fileops_stat(pathbuf, &st) == 0) {
    return pathbuf; 
  }

  //
  // Try to load the directory wide metafile
  //
  if(loaddefault && (sz = mediadb_getdirlen(pathmedia)) > 0) {
    strncpy(pathbuf, pathmedia, szpathbuf);
    strncpy(&pathbuf[sz], METAFILE_DEFAULT, szpathbuf - sz);
    if(fileops_stat(pathbuf, &st) == 0) {
      if(ploaddefault) {
        *ploaddefault = 1;
      }
      return pathbuf;
    }
  }

  return NULL;
}
Exemple #25
0
int rtmp_auth_cache_store(RTMP_AUTH_PERSIST_STORAGE_T *pcachedAuth, const RTMP_AUTH_PERSIST_T *pElem) {
  int rc = -1;
  unsigned int sz = 0;
  TIME_VAL tm;
  RTMP_AUTH_PERSIST_NODE_T *p, *p_prev = NULL;
  RTMP_AUTH_PERSIST_NODE_T *pinsert = NULL;
  RTMP_AUTH_PERSIST_NODE_T *poldest = NULL;

  if(pElem->opaque[0] == '\0') {
    return -1;
  }

  VSX_DEBUG_RTMP( LOG(X_DEBUG("RTMP auth cache storing opaque: '%s', salt: '%s', challenge: '%s'"), 
                             pElem->opaque, pElem->salt, pElem->challenge); );
Exemple #26
0
static int clearTn(const char *pathMedia, const char *pathDb, 
                   const FILE_LIST_T *pFileList) {

  DIR *pdir;
  struct dirent *direntry;
  char buf[VSX_MAX_PATH_LEN];
  char buf2[VSX_MAX_PATH_LEN];
  size_t sz,sz2;

  if(!(pdir = fileops_OpenDir(pathDb))) {
    return -1;
  }

  buf[sizeof(buf) - 1] = '\0';

  while((direntry = fileops_ReadDir(pdir))) {
    if(!(direntry->d_type & DT_DIR)) {

      // "_tn[idx].jpg"
      if((sz = strlen(direntry->d_name)) > 9 && 
         (!strncasecmp(&direntry->d_name[sz - 4], ".jpg", 4) ||
       !strncasecmp(&direntry->d_name[sz - VSXTMP_EXT_LEN], VSXTMP_EXT, VSXTMP_EXT_LEN) ||
         !strncasecmp(&direntry->d_name[sz - NOTN_EXT_LEN], NOTN_EXT, NOTN_EXT_LEN))) {

        strncpy(buf, direntry->d_name, sizeof(buf) - 1);
        for(sz2 = sz - 4; sz2 > sz - 12; sz2--) { 
          if(buf[sz2] == '_') {
            break;
          }
        }
        buf[sz2] = '\0';
//fprintf(stdout, "check '%s' '%s'\n", buf, direntry->d_name);

        if(file_list_find(pFileList, buf) == NULL) {
          mediadb_prepend_dir(pathDb, direntry->d_name, buf2, sizeof(buf));  
          LOG(X_DEBUG("Removing thumbnail '%s'\n"), buf2);
          if(fileops_DeleteFile(buf2) != 0) {
            LOG(X_ERROR("Failed to delete thumbnail %s"), buf2);
          }
        }

      }
    }
  }

  fileops_CloseDir(pdir);

  return 0;
}
Exemple #27
0
static void procdb_dump(SYS_PROCLIST_T *pProcs, int lock) {
  SYS_PROC_T *p;
  if(lock) {
    pthread_mutex_lock(&pProcs->mtx);
  }
  p = pProcs->procs;
  while(p) {
    LOG(X_DEBUG("name:'%s', id:'%s' instance:%s, flags:0x%x, numActive: %d, numPendingActive: %d"), 
          p->name, p->id, p->instanceId, p->flags, p->numActive, p->numPendingActive);
    p = p->pnext;
  }
  if(lock) {
    pthread_mutex_unlock(&pProcs->mtx);
  }
}
Exemple #28
0
static int mp4_extractMp4Vid(const MP4_CONTAINER_T *pMp4, const char *path, 
                      float fStart, float fDuration) {
  FILE_STREAM_T fStreamOut;
  MP4_TRAK_MP4V_T mp4BoxSet;
  MPG4V_CBDATA_WRITE_SAMPLE_T mpg4vDescr;
  uint64_t startHz = 0;
  uint64_t durationHz = 0;
  uint32_t sampledelta = 0;
  int rc = 0;

  if(!pMp4|| !pMp4->pStream || pMp4->pStream == FILEOPS_INVALID_FP) {
    return -1;
  }

  LOG(X_DEBUG("Extracting mpeg-4 video from %s"), pMp4->pStream->cbGetName(pMp4->pStream));

  if(mp4_initMp4vTrack(pMp4, &mp4BoxSet) < 0) {
    return -1;
  }

  durationHz = (uint64_t) (fDuration * mp4BoxSet.tk.pMdhd->timescale);
  startHz = (uint64_t) (fStart * mp4BoxSet.tk.pMdhd->timescale);

  if((fStreamOut.fp = fileops_Open(path, O_RDWR | O_CREAT)) == FILEOPS_INVALID_FP) {
    LOG(X_CRITICAL("Unable to open file for writing: %s"), path);
    return -1;
  }
  fStreamOut.offset = 0;

  if((sampledelta = mp4_getSttsSampleDelta(&mp4BoxSet.tk.pStts->list)) == 0) {
    LOG(X_WARNING("Unable to get video sample timing from stts w/ %d entries"), 
                   mp4BoxSet.tk.pStts->list.entrycnt);
  }

  rc = mpg4v_writeStart(&fStreamOut, mp4BoxSet.pEsds->specific.startcodes,
                        mp4BoxSet.pEsds->specific.type.length);

  if(rc >= 0) {
    mpg4vDescr.pStreamOut = &fStreamOut;

    rc = mp4_readSamplesFromTrack(&mp4BoxSet.tk, pMp4->pStream,  
                   mpg4v_cbWriteSample_mp4wrap, &mpg4vDescr, startHz, durationHz);
  }

  fileops_Close(fStreamOut.fp);

  return rc;
}
Exemple #29
0
int httplive_init(HTTPLIVE_DATA_T *pLive) {
  struct stat st;
  int rc = 0;

  if(!pLive) {
    return -1;
  }

  pLive->tvNextRoll.tv_sec = 0;
  pLive->tvPriorRoll.tv_sec = 0;
  if(pLive->duration <= 0) {
    pLive->duration = HTTPLIVE_DURATION_DEFAULT;
  }

  if(pLive->fs.fp != FILEOPS_INVALID_FP) {
    CloseMediaFile(&pLive->fs);
  }

  if(fileops_stat(pLive->dir, &st) != 0) {
    LOG(X_ERROR("HTTPLive dir '%s' does not exist."), pLive->dir);
    return -1;
  }

  if(pLive->fileprefix[0] == '\0') {
    strncpy(pLive->fileprefix, HTTPLIVE_TS_NAME_PRFX, sizeof(pLive->fileprefix));
  }

  if(pLive->indexCount == 0) {
    pLive->indexCount = HTTPLIVE_NUM_INDEXES_M3U_DEFAULT;
  } else if(pLive->indexCount < HTTPLIVE_NUM_INDEXES_M3U_MIN) {
    pLive->indexCount = HTTPLIVE_NUM_INDEXES_M3U_MIN;
  } else if(pLive->indexCount > HTTPLIVE_NUM_INDEXES_M3U_MAX) {
    pLive->indexCount = HTTPLIVE_NUM_INDEXES_M3U_MAX;
  }

  httplive_delete(pLive);

  LOG(X_DEBUG("HTTPLive dir: '%s' duration: %.2fs file prefix: '%s'"), 
              pLive->dir, pLive->duration, pLive->fileprefix);

#if defined(HTTPLIVE_INCLUDE_PROGRAM_DATE_TIME) 
  if(s_httplive_tm == 0) {
    s_httplive_tm = time(NULL);
  }
#endif // HTTPLIVE_INCLUDE_PROGRAM_DATE_TIME 

  return rc;
}
Exemple #30
0
int xcoder_silk_init_decoder(CODEC_WRAP_CTXT_T *pCtxt) {
  IXCODE_AUDIO_CTXT_T *pXcode = NULL;
  SILK_DECODER_CODEC_CTXT_T *pSilk = NULL;
  int ret = 0;

  if(!pCtxt || !pCtxt->pAVCtxt || !pCtxt->pXcode) {
    return -1;
  }

  pXcode = (IXCODE_AUDIO_CTXT_T *) pCtxt->pXcode;

  if(!(pSilk = (SILK_DECODER_CODEC_CTXT_T *) pCtxt->pctxt)) {
    pCtxt->pctxt = decoder_silk_alloc();
  }

  if(!(pSilk = (SILK_DECODER_CODEC_CTXT_T *) pCtxt->pctxt)) {
    return -1;
  }

  pCtxt->pAVCtxt->dec_channels = pXcode->cfgChannelsIn;
  pCtxt->pAVCtxt->decbps = 2;
  pCtxt->pAVCtxt->dec_samplerate = pXcode->cfgSampleRateIn;

  switch(pCtxt->pAVCtxt->dec_samplerate) {
    case 24000:
    case 16000:
    case 12000:
    case 8000:
      break;
    default:
      LOG(X_ERROR("Unsupported SILK decoder output sample rate %dHz"), pCtxt->pAVCtxt->dec_samplerate);
      return -1;
  }

  pSilk->decControl.framesPerPacket = 1;
  pSilk->decControl.API_sampleRate = pCtxt->pAVCtxt->dec_samplerate;

  //if((ret = SKP_Silk_SDK_InitDecoder(pSilk->psDec)) != 0) {
  if((ret = pSilk->fInitDecoder(pSilk->psDec)) != 0) {
    return -1;
  }

  LOG(X_DEBUG("Initialized SILK decoder %dHz, channels:%d"), 
    pCtxt->pAVCtxt->dec_samplerate, pCtxt->pAVCtxt->dec_channels);

  return 0;
}