Commit 6176e8bb authored by Linshizhi's avatar Linshizhi

Add flags to Proto

parent da823fa5
......@@ -12,6 +12,8 @@ static int mmRead(void *priv, uint8_t *buf, int size) {
MemMovContext *context = mmc(proto);
List *buffers = mmpBuffer(proto);
int flag = protoFlag(&proto->Base);
if ((priv == NULL || buf == NULL || size < 0)) {
return AVERROR(EINVAL);
}
......@@ -28,7 +30,8 @@ static int mmRead(void *priv, uint8_t *buf, int size) {
free(info);
}
if (mmcIsEOF(context)) {
if (mmcIsEOF(context) || flag & PROTO_FLAG_EOF) {
protoSetFlag(&proto->Base, PROTO_FLAG_EOF);
return AVERROR_EOF;
}
......
......@@ -49,6 +49,4 @@ void mmcReset(MemMovContext *mm);
void destroyBufferInfo(BufferInfo**);
#endif /* MM_H */
......@@ -8,6 +8,7 @@ Proto* createProto(ReadFunc rf, WriteFunc wf, SeekFunc sf, void *priv) {
p->seek = sf;
p->priv = priv;
p->ctx = NULL;
p->flag = PROTO_NO_FLAG_SET;
return p;
}
......@@ -56,3 +57,10 @@ AVIOContext* proto2AVIO(Proto *p, size_t bufSize) {
return ioctx;
}
void protoUnsetFlag(Proto *p, PROTO_FLAG flag_) {
int flag = protoFlag(p);
flag_ = flag_ ^ PROTO_ALL_FLAG_SET;
p->flag = flag & flag_;
}
......@@ -7,15 +7,21 @@
typedef int (*ReadFunc)(void *priv, uint8_t *buf, int size);
typedef int (*WriteFunc)(void *priv, uint8_t *buf, int size);
typedef int64_t (*SeekFunc)(void *opaque, int64_t offset, int whence);
typedef void (*ProtoDestructor)(void**);
typedef enum {
PROTO_NO_FLAG_SET = 0x0000,
PROTO_FLAG_EOF = 0x0001,
PROTO_ALL_FLAG_SET = 0x1111,
} PROTO_FLAG;
typedef struct Proto {
int (*read)(void *priv, uint8_t *buf, int size);
int (*write)(void *priv, uint8_t *buf, int size);
int64_t (*seek)(void *opaque, int64_t offset, int whence);
void *priv;
AVIOContext *ctx;
uint16_t flag;
} Proto;
/* Member function implement as macros */
......@@ -26,12 +32,16 @@ typedef struct Proto {
#define write(P, buf, size) ((P)->write((P)->priv, (buf), (size)))
#define seek(P, offset, whence) ((P)->seek((P)->priv, (offset), (whence)))
#define Super(DerivedPtr) ((Proto*)(DerivedPtr))
#define protoFlag(P) ((P)->flag)
#define protoSetFlag(P, F) ((P)->flag = (P)->flag | (F))
/* Prototypes */
Proto* createProto(ReadFunc rf, WriteFunc wr, SeekFunc sf, void *priv);
void destroyProto(Proto**);
Proto createProto_(ReadFunc rf, WriteFunc wr, SeekFunc sf, void *priv);
void destroyProto_(Proto*);
void protoUnsetFlag(Proto *p, PROTO_FLAG flag);
AVIOContext* proto2AVIO(Proto *p, size_t bufSize);
......
......@@ -107,3 +107,10 @@ CTEST2(PROTO_TEST, TO_AVIO) {
ASSERT_EQUAL(ioctx->write_packet, writeFake);
ASSERT_EQUAL(ioctx->seek, seekFake);
}
CTEST2(PROTO_TEST, FLAGS_SET_UNSET) {
ASSERT_EQUAL(protoFlag(data->proto), PROTO_NO_FLAG_SET);
protoSetFlag(data->proto, PROTO_FLAG_EOF);
ASSERT_EQUAL(protoFlag(data->proto), PROTO_FLAG_EOF);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment