Exemplo n.º 1
0
static int
htsp_login(htsp_connection_t *hc)
{
  const void *ch;
  size_t chlen;
  htsmsg_t *m;

  m = htsmsg_create_map();
  htsmsg_add_str(m, "clientname", "HTS Showtime");
  htsmsg_add_u32(m, "htspversion", 1);
  htsmsg_add_str(m, "method", "hello");
  
  if((m = htsp_reqreply(hc, m)) == NULL) {
    return -1;
  }

  if(htsmsg_get_bin(m, "challenge", &ch, &chlen) || chlen != 32) {
    htsmsg_destroy(m);
    return -1;
  }
  memcpy(hc->hc_challenge, ch, 32);

  htsmsg_destroy(m);


  m = htsmsg_create_map();
  htsmsg_add_str(m, "method", "login");
  htsmsg_add_u32(m, "htspversion", HTSP_PROTO_VERSION);

  if((m = htsp_reqreply(hc, m)) == NULL) {
    return -1;
  }

  htsmsg_destroy(m);

  return 0;
}
Exemplo n.º 2
0
DemuxPacket* cHTSPDemux::Read()
{
  htsmsg_t *  msg;
  const char* method;
  while((msg = ReadStream()))
  {
    method = htsmsg_get_str(msg, "method");
    if(method == NULL)
      break;

    if     (strcmp("subscriptionStart",  method) == 0)
    {
      SubscriptionStart(msg);
      DemuxPacket* pkt  = PVR->AllocateDemuxPacket(0);
      pkt->iStreamId    = DMX_SPECIALID_STREAMCHANGE;
      htsmsg_destroy(msg);
      return pkt;
    }
    else if(strcmp("subscriptionStop",   method) == 0)
      SubscriptionStop (msg);
    else if(strcmp("subscriptionStatus", method) == 0)
      SubscriptionStatus(msg);
    else if(strcmp("queueStatus"       , method) == 0)
      cHTSPSession::ParseQueueStatus(msg, m_QueueStatus);
    else if(strcmp("signalStatus"       , method) == 0)
      cHTSPSession::ParseSignalStatus(msg, m_Quality);
    else if(strcmp("muxpkt"            , method) == 0)
    {
      uint32_t    index, duration, frametype;
      const void* bin;
      size_t      binlen;
      int64_t     ts;
      char        frametypechar[1];

      htsmsg_get_u32(msg, "frametype", &frametype);
      frametypechar[0] = static_cast<char>( frametype );
//      XBMC->Log(LOG_DEBUG, "%s - Frame type %c", __FUNCTION__, frametypechar[0]);

      if(htsmsg_get_u32(msg, "stream" , &index)  ||
         htsmsg_get_bin(msg, "payload", &bin, &binlen))
        break;

      DemuxPacket* pkt = PVR->AllocateDemuxPacket(binlen);
      memcpy(pkt->pData, bin, binlen);

      pkt->iSize = binlen;

      if(!htsmsg_get_u32(msg, "duration", &duration))
        pkt->duration = (double)duration * DVD_TIME_BASE / 1000000;

      if(!htsmsg_get_s64(msg, "dts", &ts))
        pkt->dts = (double)ts * DVD_TIME_BASE / 1000000;
      else
        pkt->dts = DVD_NOPTS_VALUE;

      if(!htsmsg_get_s64(msg, "pts", &ts))
        pkt->pts = (double)ts * DVD_TIME_BASE / 1000000;
      else
        pkt->pts = DVD_NOPTS_VALUE;

      pkt->iStreamId = -1;
      for(unsigned int i = 0; i < m_Streams.iStreamCount; i++)
      {
        if(m_Streams.stream[i].iPhysicalId == (unsigned int)index)
        {
          pkt->iStreamId = i;
          break;
        }
      }

      htsmsg_destroy(msg);
      return pkt;
    }

    break;
  }

  if(msg)
  {
    htsmsg_destroy(msg);
    DemuxPacket* pkt  = PVR->AllocateDemuxPacket(0);
    return pkt;
  }
  return NULL;
}