⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swfdec_buffer.c

📁 Swfdec is a decoder/renderer for Macromedia Flash animations. The decoding and rendering engine is
💻 C
📖 第 1 页 / 共 2 页
字号:
 * size. */GTypeswfdec_buffer_queue_get_type (void){  static GType type_swfdec_buffer_queue = 0;  if (!type_swfdec_buffer_queue)    type_swfdec_buffer_queue = g_boxed_type_register_static      ("SwfdecBufferQueue",        (GBoxedCopyFunc) swfdec_buffer_queue_ref,       (GBoxedFreeFunc) swfdec_buffer_queue_unref);  return type_swfdec_buffer_queue;}/** * swfdec_buffer_queue_new: * * Creates a new empty buffer queue. * * Returns: a new buffer queue. Use swfdec_buffer_queue_unref () to free it. **/SwfdecBufferQueue *swfdec_buffer_queue_new (void){  SwfdecBufferQueue *buffer_queue;  buffer_queue = g_new0 (SwfdecBufferQueue, 1);  buffer_queue->ref_count = 1;  return buffer_queue;}/** * swfdec_buffer_queue_get_depth: * @queue: a #SwfdecBufferQueue * * Returns the number of bytes currently in @queue. * * Returns: amount of bytes in @queue. **/guintswfdec_buffer_queue_get_depth (SwfdecBufferQueue * queue){  g_return_val_if_fail (queue != NULL, 0);  return queue->depth;}/** * swfdec_buffer_queue_get_offset: * @queue: a #SwfdecBufferQueue * * Queries the amount of bytes that has already been pulled out of * @queue using functions like swfdec_buffer_queue_pull(). * * Returns: Number of bytes that were already pulled from this queue. **/guintswfdec_buffer_queue_get_offset (SwfdecBufferQueue * queue){  g_return_val_if_fail (queue != NULL, 0);  return queue->offset;}/** * swfdec_buffer_queue_clear: * @queue: a #SwfdecBufferQueue * * Resets @queue into to initial state. All buffers it contains will be  * released and the offset will be reset to 0. **/voidswfdec_buffer_queue_clear (SwfdecBufferQueue *queue){  g_return_if_fail (queue != NULL);  g_list_foreach (queue->buffers, (GFunc) swfdec_buffer_unref, NULL);  g_list_free (queue->buffers);  memset (queue, 0, sizeof (SwfdecBufferQueue));}/** * swfdec_buffer_queue_push: * @queue: a #SwfdecBufferQueue * @buffer: #SwfdecBuffer to append to @queue * * Appends the given @buffer to the buffers already in @queue. This function * will take ownership of the given @buffer. Use swfdec_buffer_ref () before * calling this function to keep a reference. **/voidswfdec_buffer_queue_push (SwfdecBufferQueue * queue, SwfdecBuffer * buffer){  g_return_if_fail (queue != NULL);  g_return_if_fail (buffer != NULL);  if (buffer->length == 0) {    swfdec_buffer_unref (buffer);    return;  }  queue->buffers = g_list_append (queue->buffers, buffer);  queue->depth += buffer->length;}/** * swfdec_buffer_queue_pull_buffer: * @queue: a #SwfdecBufferQueue * * Pulls the first buffer out of @queue and returns it. This function is  * equivalent to calling swfdec_buffer_queue_pull() with the size of the * first buffer in it. * * Returns: The first buffer in @queue or %NULL if @queue is empty. **/SwfdecBuffer *swfdec_buffer_queue_pull_buffer (SwfdecBufferQueue * queue){  SwfdecBuffer *buffer;  g_return_val_if_fail (queue != NULL, NULL);  if (queue->buffers == NULL)    return NULL;  buffer = queue->buffers->data;  return swfdec_buffer_queue_pull (queue, buffer->length);}/** * swfdec_buffer_queue_pull: * @queue: a #SwfdecBufferQueue * @length: amount of bytes to pull * * If enough data is still available in @queue, the first @length bytes are  * put into a new buffer and that buffer is returned. The @length bytes are * removed from the head of the queue. If not enough data is available, %NULL * is returned. * * Returns: a new #SwfdecBuffer or %NULL **/SwfdecBuffer *swfdec_buffer_queue_pull (SwfdecBufferQueue * queue, guint length){  GList *g;  SwfdecBuffer *newbuffer;  SwfdecBuffer *buffer;  SwfdecBuffer *subbuffer;  g_return_val_if_fail (queue != NULL, NULL);  g_return_val_if_fail (length > 0, NULL);  if (queue->depth < length)     return NULL;  /* FIXME: This function should share code with swfdec_buffer_queue_peek */  SWFDEC_LOG ("pulling %d, %d available", length, queue->depth);  g = g_list_first (queue->buffers);  buffer = g->data;  if (buffer->length > length) {    newbuffer = swfdec_buffer_new_subbuffer (buffer, 0, length);    subbuffer = swfdec_buffer_new_subbuffer (buffer, length,        buffer->length - length);    g->data = subbuffer;    swfdec_buffer_unref (buffer);  } else if (buffer->length == length) {    queue->buffers = g_list_remove (queue->buffers, buffer);    newbuffer = buffer;  } else {    guint offset = 0;    newbuffer = swfdec_buffer_new_and_alloc (length);    while (offset < length) {      g = g_list_first (queue->buffers);      buffer = g->data;      if (buffer->length > length - offset) {        guint n = length - offset;        oil_copy_u8 (newbuffer->data + offset, buffer->data, n);        subbuffer = swfdec_buffer_new_subbuffer (buffer, n, buffer->length - n);        g->data = subbuffer;        swfdec_buffer_unref (buffer);        offset += n;      } else {        oil_copy_u8 (newbuffer->data + offset, buffer->data, buffer->length);        queue->buffers = g_list_delete_link (queue->buffers, g);        offset += buffer->length;	swfdec_buffer_unref (buffer);      }    }  }  queue->depth -= length;  queue->offset += length;  return newbuffer;}/** * swfdec_buffer_queue_peek: * @queue: a #SwfdecBufferQueue to read from * @length: amount of bytes to peek * * Creates a new buffer with the first @length bytes from @queue, but unlike  * swfdec_buffer_queue_pull(), does not remove them from @queue. * * Returns: NULL if the requested amount of data wasn't available or a new  *          readonly #SwfdecBuffer. Use swfdec_buffer_unref() after use. **/SwfdecBuffer *swfdec_buffer_queue_peek (SwfdecBufferQueue * queue, guint length){  GList *g;  SwfdecBuffer *newbuffer;  SwfdecBuffer *buffer;  guint offset = 0;  g_return_val_if_fail (length > 0, NULL);  if (queue->depth < length)    return NULL;  SWFDEC_LOG ("peeking %d, %d available", length, queue->depth);  g = g_list_first (queue->buffers);  buffer = g->data;  if (buffer->length > length) {    newbuffer = swfdec_buffer_new_subbuffer (buffer, 0, length);  } else {    newbuffer = swfdec_buffer_new_and_alloc (length);    while (offset < length) {      buffer = g->data;      if (buffer->length > length - offset) {        int n = length - offset;        oil_copy_u8 (newbuffer->data + offset, buffer->data, n);        offset += n;      } else {        oil_copy_u8 (newbuffer->data + offset, buffer->data, buffer->length);        offset += buffer->length;      }      g = g_list_next (g);    }  }  return newbuffer;}/** * swfdec_buffer_queue_ref: * @queue: a #SwfdecBufferQueue * * increases the reference count of @queue by one. * * Returns: The passed in @queue. **/SwfdecBufferQueue *swfdec_buffer_queue_ref (SwfdecBufferQueue * queue){  g_return_val_if_fail (queue != NULL, NULL);  g_return_val_if_fail (queue->ref_count > 0, NULL);  queue->ref_count++;  return queue;}/** * swfdec_buffer_queue_unref: * @queue: a #SwfdecBufferQueue * * Decreases the reference count of @queue by one. If no reference  * to this buffer exists anymore, the buffer and the memory  * it manages are freed. **/voidswfdec_buffer_queue_unref (SwfdecBufferQueue * queue){  g_return_if_fail (queue != NULL);  g_return_if_fail (queue->ref_count > 0);  queue->ref_count--;  if (queue->ref_count == 0) {    swfdec_buffer_queue_clear (queue);    g_free (queue);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -