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; }
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; }
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; }
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; }