예제 #1
0
static int
flush_temp_store (oggdmux_prc_t * ap_prc, const OMX_U32 a_pid)
{
  OMX_BUFFERHEADERTYPE * p_hdr = NULL;
  OMX_U32 * p_offset = get_store_offset_ptr (ap_prc, a_pid);
  OMX_U32 ds_offset = *p_offset;

  assert (p_offset);

  if (0 == *p_offset)
    {
      /* The temp store is empty */
      return 0;
    }

  while ((p_hdr = get_header (ap_prc, a_pid)))
    {
      ds_offset = dump_temp_store (ap_prc, a_pid, p_hdr);
#ifdef _DEBUG
      if (a_pid == ARATELIA_OGG_DEMUXER_AUDIO_PORT_BASE_INDEX)
        {
          g_total_released += p_hdr->nFilledLen;
          OMX_U32 * p_offset = get_store_offset_ptr (ap_prc, a_pid);
          TIZ_TRACE (handleOf (ap_prc),
                     "total released [%d] "
                     "total read [%d] store [%d] last read [%d] diff [%d]",
                     g_total_released, g_total_read, *p_offset, g_last_read,
                     g_total_read - (g_total_released + *p_offset));
        }
#endif
      if (ap_prc->file_eos_ && 0 == ds_offset)
        {
          bool * p_eos = get_eos_ptr (ap_prc, a_pid);
          if (!p_eos)
            {
              TIZ_DEBUG (handleOf (ap_prc), "Adding EOS flag - PID [%d]",
                         a_pid);
              p_hdr->nFlags |= OMX_BUFFERFLAG_EOS;
              *p_eos = true;
            }
        }
      release_header (ap_prc, a_pid);
      p_hdr = 0;
      if (0 == ds_offset)
        {
          break;
        }
    }
  return ds_offset;
}
예제 #2
0
static int
flush_ogg_packet (oggdmux_prc_t * ap_prc, const OMX_U32 a_pid,
                  const OMX_U8 * ap_ogg_data, const OMX_U32 nbytes)
{
  OMX_BUFFERHEADERTYPE * p_hdr = NULL;
  OMX_U32 nbytes_remaining = nbytes;
  OMX_U32 nbytes_copied = 0;
  OMX_U32 op_offset = 0;

  while ((p_hdr = get_header (ap_prc, a_pid)))
    {
      nbytes_copied = dump_ogg_data (ap_prc, a_pid, ap_ogg_data + op_offset,
                                     nbytes_remaining, p_hdr);
      nbytes_remaining -= nbytes_copied;
      op_offset += nbytes_copied;
#ifdef _DEBUG
      if (a_pid == ARATELIA_OGG_DEMUXER_AUDIO_PORT_BASE_INDEX)
        {
          g_total_released += p_hdr->nFilledLen;
          OMX_U32 * p_offset = get_store_offset_ptr (ap_prc, a_pid);
          TIZ_TRACE (handleOf (ap_prc),
                     "total released [%d] "
                     "total read [%d] store [%d] last read [%d] "
                     "remaining [%d] diff [%d]",
                     g_total_released, g_total_read, *p_offset, g_last_read,
                     nbytes_remaining,
                     g_total_read - (g_total_released + nbytes_remaining));
        }
#endif
      release_header (ap_prc, a_pid);
      p_hdr = 0;
      if (0 == nbytes_remaining)
        {
          break;
        }
    }

  if (nbytes_remaining > 0)
    {
      /* Need_more_buffers. Temporarily store the data until an omx buffer is
       * available */
      TIZ_TRACE (handleOf (ap_prc), "Need to store [%d] bytes - pid [%d]",
                 nbytes_remaining, a_pid);
      nbytes_remaining
        = store_data (ap_prc, a_pid, ap_ogg_data + op_offset, nbytes_remaining);
    }

  return nbytes_remaining;
}
예제 #3
0
static bool
release_header_with_eos (oggdmux_prc_t * ap_prc, const OMX_U32 a_pid)
{
  bool eos_released = false;
  OMX_BUFFERHEADERTYPE * p_hdr = get_header (ap_prc, a_pid);

  if (p_hdr)
    {
      TIZ_TRACE (handleOf (ap_prc), "Adding EOS flag - PID [%d]", a_pid);
      p_hdr->nFlags |= OMX_BUFFERFLAG_EOS;
      release_header (ap_prc, a_pid);
      eos_released = true;
    }
  return eos_released;
}
예제 #4
0
static void
request_set_header (struct request *req, char *name, char *value,
					enum rp release_policy)
{
	struct request_header *hdr;
	int i;

	if (!value)
	{
		/* A NULL value is a no-op; if freeing the name is requested,
		free it now to avoid leaks.  */
		if (release_policy == rel_name || release_policy == rel_both)
			free (name);
		return;
	}

	for (i = 0; i < req->hcount; i++)
	{
		hdr = &req->headers[i];
		if (0 == strcmp (name, hdr->name))
		{
			/* Replace existing header. */
			release_header (hdr);
			hdr->name = name;
			hdr->value = value;
			hdr->release_policy = release_policy;
			return;
		}
	}

	/* Install new header. */

	if (req->hcount >= req->hcapacity)
	{
		req->hcapacity <<= 1;
		req->headers = (struct request_header*)realloc(req->headers, req->hcapacity * sizeof (*hdr));
	}
	hdr = &req->headers[req->hcount++];
	hdr->name = name;
	hdr->value = value;
	hdr->release_policy = release_policy;
}