Exemple #1
0
DemuxPacket* CDVDDemuxClient::Read()
{
  if (!m_IDemux)
    return nullptr;

  DemuxPacket* pPacket = m_IDemux->ReadDemux();
  if (!pPacket)
  {
    return nullptr;
  }

  if (pPacket->iStreamId == DMX_SPECIALID_STREAMINFO)
  {
    RequestStreams();
    CDVDDemuxUtils::FreeDemuxPacket(pPacket);
    return CDVDDemuxUtils::AllocateDemuxPacket(0);
  }
  else if (pPacket->iStreamId == DMX_SPECIALID_STREAMCHANGE)
  {
    RequestStreams();
  }
  else if (pPacket->iStreamId >= 0 &&
           pPacket->iStreamId < MAX_STREAMS &&
           m_streams[pPacket->iStreamId])
  {
    ParsePacket(pPacket);
  }

  return pPacket;
}
Exemple #2
0
DemuxPacket* CDVDDemuxClient::Read()
{
  if (!m_IDemux)
    return nullptr;

  if (m_packet)
    return m_packet.release();

  m_packet.reset(m_IDemux->ReadDemux());
  if (!m_packet)
  {
    return nullptr;
  }

  if (m_packet->iStreamId == DMX_SPECIALID_STREAMINFO)
  {
    RequestStreams();
    CDVDDemuxUtils::FreeDemuxPacket(m_packet.release());
    return CDVDDemuxUtils::AllocateDemuxPacket(0);
  }
  else if (m_packet->iStreamId == DMX_SPECIALID_STREAMCHANGE)
  {
    RequestStreams();
  }
  else if (m_packet->iStreamId >= 0 && m_streams.count(m_packet->iStreamId) > 0)
  {
    if (ParsePacket(m_packet.get()))
    {
      RequestStreams();
      DemuxPacket *pPacket = CDVDDemuxUtils::AllocateDemuxPacket(0);
      pPacket->iStreamId = DMX_SPECIALID_STREAMCHANGE;
      pPacket->demuxerId = m_demuxerId;
      return pPacket;
    }
  }

  CDVDInputStream::IDisplayTime *inputStream = m_pInput->GetIDisplayTime();
  if (inputStream)
  {
    int dispTime = inputStream->GetTime();
    if (m_displayTime != dispTime)
    {
      m_displayTime = dispTime;
      if (m_packet->dts != DVD_NOPTS_VALUE)
      {
        m_dtsAtDisplayTime = m_packet->dts;
      }
    }
    if (m_dtsAtDisplayTime != DVD_NOPTS_VALUE && m_packet->dts != DVD_NOPTS_VALUE)
    {
      m_packet->dispTime = m_displayTime;
      m_packet->dispTime += DVD_TIME_TO_MSEC(m_packet->dts - m_dtsAtDisplayTime);
    }
  }
  return m_packet.release();
}
bool CDVDDemuxPVRClient::Open(CDVDInputStream* pInput)
{
  Abort();
  m_pInput = pInput;
  RequestStreams();
  return true;
}
bool RequestTracker::Remove(std::shared_ptr<CaptureRequest> request) {
  if (!request) {
    return false;
  }

  // Get the request.
  const auto frame_number_request =
      frames_in_flight_.find(request->frame_number);
  if (frame_number_request == frames_in_flight_.end()) {
    ALOGE("%s: Frame %u is not in flight.", __func__, request->frame_number);
    return false;
  } else if (request != frame_number_request->second) {
    ALOGE(
        "%s: Request for frame %u cannot be removed: "
        "does not matched the stored request.",
        __func__,
        request->frame_number);
    return false;
  }

  frames_in_flight_.erase(frame_number_request);

  // Decrement the counts of used streams.
  for (const auto stream : RequestStreams(*request)) {
    --buffers_in_flight_[stream];
  }

  return true;
}
Exemple #5
0
DemuxPacket* CDVDDemuxClient::Read()
{
    if (!m_IDemux)
        return nullptr;

    DemuxPacket* pPacket = m_IDemux->ReadDemux();
    if (!pPacket)
    {
        return nullptr;
    }

    if (pPacket->iStreamId == DMX_SPECIALID_STREAMINFO)
    {
        RequestStreams();
        CDVDDemuxUtils::FreeDemuxPacket(pPacket);
        return CDVDDemuxUtils::AllocateDemuxPacket(0);
    }
    else if (pPacket->iStreamId == DMX_SPECIALID_STREAMCHANGE)
    {
        RequestStreams();
    }
    else if (pPacket->iStreamId >= 0 &&
             m_streams[pPacket->iStreamId])
    {
        ParsePacket(pPacket);
    }

    CDVDInputStream::IDisplayTime *inputStream = m_pInput->GetIDisplayTime();
    if (inputStream)
    {
        int dispTime = inputStream->GetTime();
        if (m_displayTime != dispTime)
        {
            m_displayTime = dispTime;
            if (pPacket->dts != DVD_NOPTS_VALUE)
            {
                m_dtsAtDisplayTime = pPacket->dts;
            }
        }
        if (m_dtsAtDisplayTime != DVD_NOPTS_VALUE && pPacket->dts != DVD_NOPTS_VALUE)
        {
            pPacket->dispTime = m_displayTime;
            pPacket->dispTime += DVD_TIME_TO_MSEC(pPacket->dts - m_dtsAtDisplayTime);
        }
    }
    return pPacket;
}
Exemple #6
0
bool CDVDDemuxClient::Open(CDVDInputStream* pInput)
{
  Abort();

  m_pInput = pInput;
  m_IDemux = dynamic_cast<CDVDInputStream::IDemux*>(m_pInput);
  if (!m_IDemux)
    return false;

  if (!m_IDemux->OpenDemux())
    return false;

  RequestStreams();
  return true;
}
bool RequestTracker::Add(std::shared_ptr<CaptureRequest> request) {
  if (!CanAddRequest(*request)) {
    return false;
  }

  // Add to the count for each stream used.
  for (const auto stream : RequestStreams(*request)) {
    ++buffers_in_flight_[stream];
  }

  // Store the request.
  frames_in_flight_[request->frame_number] = request;

  return true;
}
Exemple #8
0
bool CDVDDemuxClient::Open(std::shared_ptr<CDVDInputStream> pInput)
{
  Abort();

  m_pInput = pInput;
  m_IDemux = std::dynamic_pointer_cast<CDVDInputStream::IDemux>(m_pInput);
  if (!m_IDemux)
    return false;

  if (!m_IDemux->OpenDemux())
    return false;

  RequestStreams();

  m_displayTime = 0;
  m_dtsAtDisplayTime = DVD_NOPTS_VALUE;
  return true;
}
Exemple #9
0
bool CDVDDemuxClient::Open(CDVDInputStream* pInput)
{
  Abort();

  m_pInput = pInput;
  m_IDemux = dynamic_cast<CDVDInputStream::IDemux*>(m_pInput);
  if (!m_IDemux)
    return false;

  if (!m_IDemux->OpenDemux())
    return false;

  RequestStreams();

  m_displayTime = 0;
  m_dtsAtDisplayTime = DVD_NOPTS_VALUE;
  return true;
}
bool RequestTracker::CanAddRequest(const CaptureRequest& request) const {
  // Check that it's not a duplicate.
  if (frames_in_flight_.count(request.frame_number) > 0) {
    ALOGE("%s: Already tracking a request with frame number %d.",
          __func__,
          request.frame_number);
    return false;
  }

  // Check that each stream has space
  // (which implicitly checks if it is configured).
  bool result = true;
  for (const auto stream : RequestStreams(request)) {
    if (StreamFull(stream)) {
      ALOGE("%s: Stream %p is full.", __func__, stream);
      return false;
    }
  }
  return true;
}