Exemple #1
0
static void queue_put(Queue *q, Conn *conn)
{
    mon_lock(q->mon);

    q->head = list_prepend(q->head, conn);
    if (q->tail == NULL)
        q->tail = q->head;

    mon_signal(q->mon);
    mon_unlock(q->mon);
}
Exemple #2
0
static Conn *queue_get(Queue *q)
{
    mon_lock(q->mon);
    while (q->tail == NULL)
        mon_wait(q->mon, -1);

    Conn *conn = q->tail->elem;
    q->tail = list_prev(q->tail);
    if (q->tail == NULL)
        q->head = NULL;

    mon_unlock(q->mon);

    return conn;
}
nsresult
GonkVideoDecoderManager::Input(MediaRawData* aSample)
{
  MonitorAutoLock mon(mMonitor);
  nsRefPtr<MediaRawData> sample;

  if (!aSample) {
    // It means EOS with empty sample.
    sample = new MediaRawData();
  } else {
    sample = aSample;
  }

  mQueueSample.AppendElement(sample);

  status_t rv;
  while (mQueueSample.Length()) {
    nsRefPtr<MediaRawData> data = mQueueSample.ElementAt(0);
    {
      MonitorAutoUnlock mon_unlock(mMonitor);
      rv = mDecoder->Input(reinterpret_cast<const uint8_t*>(data->mData),
                           data->mSize,
                           data->mTime,
                           0);
    }
    if (rv == OK) {
      mQueueSample.RemoveElementAt(0);
    } else if (rv == -EAGAIN || rv == -ETIMEDOUT) {
      // In most cases, EAGAIN or ETIMEOUT are safe because OMX can't fill
      // buffer on time.
      return NS_OK;
    } else {
      return NS_ERROR_UNEXPECTED;
    }
  }

  return NS_OK;
}
Exemple #4
0
static void queue_wait(Queue *q, int ms)
{
    mon_lock(q->mon);
    mon_wait(q->mon, ms);
    mon_unlock(q->mon);
}