dect
/
asterisk
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
asterisk/frame.c

90 lines
1.9 KiB
C
Executable File

/*
* Asterisk -- A telephony toolkit for Linux.
*
* Frame manipulation routines
*
* Copyright (C) 1999, Mark Spencer
*
* Mark Spencer <markster@linux-support.net>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
*/
#include <asterisk/frame.h>
#include <asterisk/logger.h>
#include <stdlib.h>
#include <string.h>
/*
* Important: I should be made more efficient. Frame headers should
* most definitely be cached
*/
void ast_frfree(struct ast_frame *fr)
{
if (fr->mallocd & AST_MALLOCD_DATA) {
if (fr->data)
free(fr->data - fr->offset);
}
if (fr->mallocd & AST_MALLOCD_SRC) {
if (fr->src)
free(fr->src);
}
if (fr->mallocd & AST_MALLOCD_HDR) {
free(fr);
}
}
void ast_frchain(struct ast_frame_chain *fc)
{
struct ast_frame_chain *last;
while(fc) {
last = fc;
fc = fc->next;
if (last->fr)
ast_frfree(last->fr);
free(last);
}
}
struct ast_frame *ast_frisolate(struct ast_frame *fr)
{
struct ast_frame *out;
if (!(fr->mallocd & AST_MALLOCD_HDR)) {
/* Allocate a new header if needed */
out = malloc(sizeof(struct ast_frame));
if (!out) {
ast_log(LOG_WARNING, "Out of memory\n");
return NULL;
}
out->frametype = fr->frametype;
out->subclass = fr->subclass;
out->datalen = 0;
out->timelen = fr->timelen;
out->offset = 0;
out->src = NULL;
out->data = NULL;
} else {
out = fr;
}
if (!(fr->mallocd & AST_MALLOCD_SRC)) {
if (fr->src)
out->src = strdup(fr->src);
} else
out->src = fr->src;
if (!(fr->mallocd & AST_MALLOCD_DATA)) {
out->data = malloc(fr->datalen + fr->offset);
out->data += fr->offset;
out->offset = fr->offset;
out->datalen = fr->datalen;
memcpy(out->data, fr->data, fr->datalen);
if (!out->data) {
ast_log(LOG_WARNING, "Out of memory\n");
return NULL;
}
}
out->mallocd = AST_MALLOCD_HDR | AST_MALLOCD_SRC | AST_MALLOCD_DATA;
return out;
}