📄 frameextractor.c
字号:
/////
/// FrameExtractor.c
///
/// Written by Simon Chun (simon.chun@samsung.com)
/// 2007/03/16
/// 2007/07/20
///
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "FrameExtractor.h"
#include "FileRead.h"
//
// FRAMEX_CTX *FrameExtractorInit(unsigned char delimiter[], int delim_leng, int delim_insert)
//
// Description
// This function initializes the FRAMEX_CTX structure with the delimiter
// Return
// FRAME_CTX* : FRAMEX_CTX structure. It should be released by FrameExtractorFinal() function.
// Parameters
// delimiter [IN]: pointer to the array that holds the delimiter octets.
// delim_leng [IN]: length of the delimiter octets
// delim_insert [IN]: 0-delimiter甫 outbuf俊 持瘤 臼澜. 1-delimiter甫 outbuf俊 持澜
//
FRAMEX_CTX *FrameExtractorInit(FRAMEX_IN_TYPE type, unsigned char delimiter[], int delim_leng, int delim_insert)
{
FRAMEX_CTX *pCTX;
// parameter checking
if (delimiter == NULL || (delim_leng <= 0 || delim_leng > QUEUE_CAPACITY))
return NULL;
pCTX = (FRAMEX_CTX *) malloc(sizeof(FRAMEX_CTX));
memset(pCTX, 0, sizeof(FRAMEX_CTX));
pCTX->in_type = type;
pCTX->delim_ptr = (unsigned char *) malloc(delim_leng);
pCTX->delim_leng = delim_leng;
memcpy(pCTX->delim_ptr, delimiter, delim_leng);
pCTX->delim_insert = delim_insert;
pCTX->cont_offset = 0;
return pCTX;
}
#define Q_INIT(queue, qp_s, qp_e, q_size, q_capacity) \
{ \
memset(queue, 0xFF, q_capacity); \
qp_s = qp_e = q_size = 0; \
}
#define Q_PUSH(value, queue, qp_s, qp_e, q_size, q_capacity) \
{ \
queue[qp_s] = value; \
qp_s = (qp_s + 1) % q_capacity; \
q_size++; \
}
#define Q_POP(value, queue, qp_s, qp_e, q_size, q_capacity) \
{ \
value = queue[qp_e]; \
queue[qp_e] = 0xFE; \
qp_e = (qp_e + 1) % q_capacity; \
q_size--; \
}
#define Q_PEEK(value, queue, qp_s, qp_e) \
{ \
value = queue[qp_e]; \
}
// 促澜狼 delimiter甫 茫绰促.
static int next_delimiter(FRAMEX_CTX *pCTX, FILE *fpin, unsigned char *outbuf, const int outbuf_size, int *n_fill)
{
int r;
int l;
int nbytes_to_write;
int qp_s, qp_e, q_size;
unsigned char queue[QUEUE_CAPACITY], b, c;
int offset;
offset = 0;
nbytes_to_write = outbuf_size;
Q_INIT(queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
// 府畔且 outbuf 滚欺狼 盖 菊俊 delimiter甫 盲况持绰促.
if (outbuf != NULL) {
if (pCTX->cont_offset == 0) {
if (nbytes_to_write <= pCTX->delim_leng) {
return FRAMEX_ERR_BUFSIZE_TOO_SMALL;
}
if (pCTX->delim_insert) {
memcpy(outbuf, pCTX->delim_ptr, pCTX->delim_leng);
outbuf += pCTX->delim_leng;
nbytes_to_write -= pCTX->delim_leng; // 啊瓷茄 农扁甫 delimiter 辨捞父怒 哗具窃
*n_fill = pCTX->delim_leng;
}
else
*n_fill = 0;
}
else {
// continue肺 甸绢柯 版快绰 (pCTX->cont_offset != 0)
offset = pCTX->cont_offset;
outbuf += (pCTX->cont_offset - pCTX->delim_leng);
for (l=0; l<pCTX->delim_leng; l++) {
Q_PUSH(*outbuf, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
outbuf++;
}
}
}
// delimiter客 悼老茄 octet stream阑 茫酒辰促.
for (l=0; l<pCTX->delim_leng; l++) {
if (q_size == 0 || l == q_size) {
if (outbuf != NULL && offset >= nbytes_to_write) {
if (pCTX->cont_offset == 0)
pCTX->cont_offset = (pCTX->delim_leng + offset);
else
pCTX->cont_offset = offset;
return FRAMEX_CONTINUE;
}
r = fread(&b, 1, 1, fpin);
if (r != 1) // EOF甫 父抄版快..
break;
offset++;
if (outbuf != NULL) { // outbuf俊 佬绢辰 蔼阑 汗荤窃.
*outbuf = b; outbuf++; (*n_fill)++;
}
}
else {
r = -1;
Q_PEEK(b, queue, qp_s, qp_e + l)
}
if (b == pCTX->delim_ptr[l]) {
if (r == 1) // 货肺 佬篮 版快俊父 PUSH茄促.
Q_PUSH(b, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
}
else {
if (r != 1)
// 货肺 佬篮 版快啊 酒聪扼搁, 窍唱 哗滚赴促.
Q_POP(c, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
else if (l > 0) {
// 货肺 佬篮 版快 吝俊辑, delimiter狼 霉 octet(l=0)阑 厚背窍绰 版快绰
// QUEUE俊 持瘤 臼绊 官肺 逞绢埃促.
// 2锅掳 octet捞惑(l>0)阑 厚背窍绰 版快绰,
// 盖 菊俊 窍唱甫 哗绊 盖 第俊 货肺 窍唱甫 持绰促.
Q_POP(c, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
Q_PUSH(b, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
}
l = -1;
}
}
if (r == 1) {
if (outbuf != NULL) {
*n_fill -= pCTX->delim_leng;
pCTX->cont_offset = 0;
}
return FRAMEX_OK;
}
else if (r == 0)
return FRAMEX_ERR_EOS;
return FRAMEX_ERR_NOTFOUND;
}
// 促澜狼 frame俊辑 盔窍绰 荐狼 octets 蔼阑 犬牢父 茄促.
static int next_frame_peek(FRAMEX_CTX *pCTX, FILE *fpin, unsigned char *peekbuf, const int peek_size, int *n_fill)
{
int r;
int l;
int nbytes_to_peek;
int qp_s, qp_e, q_size;
unsigned char queue[QUEUE_CAPACITY], b, c;
int offset;
offset = 0;
nbytes_to_peek = peek_size;
Q_INIT(queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
// 府畔且 outbuf 滚欺狼 盖 菊俊 delimiter甫 盲况持绰促.
if (peekbuf != NULL) {
if (pCTX->cont_offset == 0) {
if (nbytes_to_peek <= pCTX->delim_leng) {
return FRAMEX_ERR_BUFSIZE_TOO_SMALL;
}
if (pCTX->delim_insert) {
memcpy(peekbuf, pCTX->delim_ptr, pCTX->delim_leng);
peekbuf += pCTX->delim_leng;
nbytes_to_peek -= pCTX->delim_leng; // 啊瓷茄 农扁甫 delimiter 辨捞父怒 哗具窃
*n_fill = pCTX->delim_leng;
}
else
*n_fill = 0;
}
else {
// continue肺 甸绢柯 版快绰 ERROR促.
}
}
for (l=0; l<pCTX->delim_leng; l++) {
if (q_size == 0 || l == q_size) {
r = fread(&b, 1, 1, fpin);
if (r != 1)
break;
offset++;
if (peekbuf != NULL) {
*peekbuf = b; peekbuf++; (*n_fill)++;
}
// fread 俺荐啊 peek_size啊 登搁, 呕免茄促.
if (offset >= nbytes_to_peek)
break;
}
else {
r = -1;
Q_PEEK(b, queue, qp_s, qp_e + l)
}
if (b == pCTX->delim_ptr[l]) {
if (r == 1) // 货肺 佬篮 版快俊父 PUSH茄促.
Q_PUSH(b, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
}
else {
if (r != 1)
// 货肺 佬篮 版快啊 酒聪扼搁, 窍唱 哗滚赴促.
Q_POP(c, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
else if (l > 0) {
// 货肺 佬篮 版快 吝俊辑, delimiter狼 霉 octet(l=0)阑 厚背窍绰 版快绰
// QUEUE俊 持瘤 臼绊 官肺 逞绢埃促.
// 2锅掳 octet捞惑(l>0)阑 厚背窍绰 版快绰,
// 盖 菊俊 窍唱甫 哗绊 盖 第俊 货肺 窍唱甫 持绰促.
Q_POP(c, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
Q_PUSH(b, queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
}
l = -1;
}
}
if (r == 1) {
if (peekbuf != NULL) {
*n_fill -= pCTX->delim_leng;
pCTX->cont_offset = 0;
}
fseek(fpin, -(peek_size-pCTX->delim_leng), SEEK_CUR);
return FRAMEX_OK;
}
else if (r == 0)
return FRAMEX_ERR_EOS;
return FRAMEX_ERR_NOTFOUND;
}
// 促澜狼 delimiter甫 茫绰促.
static int next_delimiter_mem(FRAMEX_CTX *pCTX, MMAP_STRM_PTR *strm_ptr, unsigned char *outbuf, const int outbuf_size, int *n_fill)
{
int r;
int l;
int nbytes_to_write;
int qp_s, qp_e, q_size;
unsigned char queue[QUEUE_CAPACITY], b, c;
int offset;
offset = 0;
nbytes_to_write = outbuf_size;
Q_INIT(queue, qp_s, qp_e, q_size, QUEUE_CAPACITY)
// 府畔且 outbuf 滚欺狼 盖 菊俊 delimiter甫 盲况持绰促.
if (outbuf != NULL) {
if (pCTX->cont_offset == 0) {
if (nbytes_to_write <= pCTX->delim_leng) {
return FRAMEX_ERR_BUFSIZE_TOO_SMALL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -