Blame src/libbluray/decoders/pes_buffer.c

Packit 5e46da
/*
Packit 5e46da
 * This file is part of libbluray
Packit 5e46da
 * Copyright (C) 2010  hpi1
Packit 5e46da
 *
Packit 5e46da
 * This library is free software; you can redistribute it and/or
Packit 5e46da
 * modify it under the terms of the GNU Lesser General Public
Packit 5e46da
 * License as published by the Free Software Foundation; either
Packit 5e46da
 * version 2.1 of the License, or (at your option) any later version.
Packit 5e46da
 *
Packit 5e46da
 * This library is distributed in the hope that it will be useful,
Packit 5e46da
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5e46da
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 5e46da
 * Lesser General Public License for more details.
Packit 5e46da
 *
Packit 5e46da
 * You should have received a copy of the GNU Lesser General Public
Packit 5e46da
 * License along with this library. If not, see
Packit 5e46da
 * <http://www.gnu.org/licenses/>.
Packit 5e46da
 */
Packit 5e46da
Packit 5e46da
#if HAVE_CONFIG_H
Packit 5e46da
#include "config.h"
Packit 5e46da
#endif
Packit 5e46da
Packit 5e46da
#include "pes_buffer.h"
Packit 5e46da
Packit 5e46da
#include "util/macro.h"
Packit 5e46da
Packit 5e46da
#include <stdlib.h>
Packit 5e46da
#include <string.h>
Packit 5e46da
Packit 5e46da
PES_BUFFER *pes_buffer_alloc(void)
Packit 5e46da
{
Packit 5e46da
    PES_BUFFER *p = calloc(1, sizeof(*p));
Packit 5e46da
Packit 5e46da
    return p;
Packit 5e46da
}
Packit 5e46da
Packit 5e46da
void pes_buffer_free(PES_BUFFER **p)
Packit 5e46da
{
Packit 5e46da
    if (p && *p) {
Packit 5e46da
        if ((*p)->next) {
Packit 5e46da
            pes_buffer_free(&(*p)->next);
Packit 5e46da
        }
Packit 5e46da
        X_FREE ((*p)->buf);
Packit 5e46da
        X_FREE (*p);
Packit 5e46da
    }
Packit 5e46da
}
Packit 5e46da
Packit 5e46da
void pes_buffer_append(PES_BUFFER **head, PES_BUFFER *buf)
Packit 5e46da
{
Packit 5e46da
    if (!head) {
Packit 5e46da
        return;
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    if (!*head) {
Packit 5e46da
        *head = buf;
Packit 5e46da
        return;
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    if (buf) {
Packit 5e46da
        PES_BUFFER *tail = *head;
Packit 5e46da
        for (; tail->next; tail = tail->next) ;
Packit 5e46da
        tail->next = buf;
Packit 5e46da
    }
Packit 5e46da
}
Packit 5e46da
Packit 5e46da
static PES_BUFFER *_prev_buffer(PES_BUFFER *head, PES_BUFFER *buf)
Packit 5e46da
{
Packit 5e46da
    while (head) {
Packit 5e46da
        if (head->next == buf) {
Packit 5e46da
            return head;
Packit 5e46da
        }
Packit 5e46da
        head = head->next;
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    return NULL;
Packit 5e46da
}
Packit 5e46da
Packit 5e46da
void pes_buffer_remove(PES_BUFFER **head, PES_BUFFER *p)
Packit 5e46da
{
Packit 5e46da
    if (head && *head && p) {
Packit 5e46da
        if (*head == p) {
Packit 5e46da
            *head = (*head)->next;
Packit 5e46da
            p->next = NULL;
Packit 5e46da
            pes_buffer_free(&p);
Packit 5e46da
        } else {
Packit 5e46da
            PES_BUFFER *prev = _prev_buffer(*head, p);
Packit 5e46da
            if (prev) {
Packit 5e46da
                prev->next = p->next;
Packit 5e46da
                p->next = NULL;
Packit 5e46da
                pes_buffer_free(&p);
Packit 5e46da
            }
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
}
Packit 5e46da
Packit 5e46da
void pes_buffer_next(PES_BUFFER **head)
Packit 5e46da
{
Packit 5e46da
    if (head && *head) {
Packit 5e46da
        PES_BUFFER *p = *head;
Packit 5e46da
        *head = (*head)->next;
Packit 5e46da
        p->next = NULL;
Packit 5e46da
        pes_buffer_free(&p);
Packit 5e46da
    }
Packit 5e46da
}