case FRAMETYPE_AUD0 ... FRAMETYPE_AUDMAX:
parsed = parse_audio_frame(len, &full);
break;
+ case FRAMETYPE_PRIVATE_1:
+ parsed = parse_private1_frame(len, &full);
+ break;
}
ret += parsed; len -= parsed;
if (full) // We have to exit early.
break; // out of while loop
}
-// Log::getInstance()->log("Demuxer", Log::DEBUG, "Put %d; took %d", ret + len, ret);
+ Log::getInstance()->log(
+ "Demuxer", Log::DEBUG, "Put %d; took %d", ret + len, ret);
return ret;
}
break;
case FRAMETYPE_VID0 ... FRAMETYPE_VIDMAX:
case FRAMETYPE_AUD0 ... FRAMETYPE_AUDMAX:
+ case FRAMETYPE_PRIVATE_1:
state_frametype = byte;
return ret;
}
return ret;
}
+int Demuxer::parse_private1_frame(int len, int* full)
+{
+ int ret = 0; // return number of bytes consumed
+ int bytes_remaining;
+
+ switch(state_framepos)
+ {
+ case 0: // Brand new frame. Set initial states.
+ // Get MSB of frame length and copy to local frame.
+ frame_length = *inbuf << 8;
+ ++inbuf; ++state_framepos; ++ret; --len;
+ if (len == 0) return ret;
+ // FALL THROUGH TO NEXT BYTE IN STREAM
+ case 1: // Get LSB of frame length and copy to local frame.
+ frame_length += *inbuf;
+ local_frame[5] = *inbuf;
+ ++inbuf; ++state_framepos; ++ret; --len;
+ if (len == 0) return ret;
+ }
+ // We are in the frame data
+ bytes_remaining = 2 + frame_length - state_framepos;
+ // Temporary - just discard the frame.
+ if (len >= bytes_remaining)
+ {
+ inbuf += bytes_remaining;
+ ret += bytes_remaining;
+ state_frametype = state_framepos = 0;
+ return ret;
+ }
+ else
+ {
+ inbuf += len; ret += len;
+ state_framepos += len;
+ return ret;
+ }
+}
+
void Demuxer::parse_video_details(UCHAR* buf, int len)
{
UCHAR byte;
int parse_find_frame(int len);
int parse_video_frame(int len, int* full);
int parse_audio_frame(int len, int* full);
+ int parse_private1_frame(int len, int* full);
void parse_video_details(UCHAR* buf, int len);
UCHAR* local_frame;
enum FRAMETYPE
{
+ FRAMETYPE_PRIVATE_1 = 0xbd,
+
FRAMETYPE_AUD0 = 0xc0,
FRAMETYPE_AUD1,
FRAMETYPE_AUD2,
if (!outbuf) return 1;
bufferSize = bufsize;
bufferHead = bufferTail = 0;
- full = 0;
initted = 1;
return 0;
}
void Stream::flush()
{
bufferHead = bufferTail = 0;
- full = 0;
}
int Stream::put(UCHAR* inbuf, int len)
{
int ret = 0;
int localTail = bufferTail;
- if (len == 0 || (full)) return ret;
+ if (localTail == 0) localTail = bufferSize;
+ if (len == 0) return ret;
if (bufferHead >= localTail)
{
ret += (bufferSize - bufferHead);
len -= (bufferSize - bufferHead);
bufferHead = 0;
- if (localTail == 0) full = 1;
- if (len == 0 || (full)) return ret;
+ if (len == 0) return ret;
}
}
+
+ if (localTail - bufferHead == 1) return ret; // Full
+
// We can advance the head up to the tail
// If we reach it, we are full.
- if (len < (localTail - bufferHead))
+ if (len < (localTail - bufferHead - 1))
{
// We'll fall short of the tail.
memcpy(outbuf + bufferHead, inbuf, len);
} else
{
// We'll hit the tail.
- memcpy(outbuf + bufferHead, inbuf, (localTail - bufferHead));
- ret += (localTail - bufferHead);
- bufferHead = localTail; full = 1;
+ memcpy(outbuf + bufferHead, inbuf, (localTail - bufferHead - 1));
+ ret += (localTail - bufferHead - 1);
+ bufferHead = localTail - 1;
return ret;
}
}
int ret = 0;
int localHead = bufferHead;
int written;
- if (localHead == bufferTail && (!full)) return ret;
- if (localHead <= bufferTail)
+ if (localHead < bufferTail)
{
// Drain to the end of the buffer
written = write(fd, outbuf + bufferTail, (bufferSize - bufferTail));
if (written < 0) return ret;
- full = 0;
ret += written;
if (written == (bufferSize - bufferTail))
bufferTail = 0;
else
+ {
bufferTail += written;
- if (localHead == 0) return ret;
+ return ret;
+ }
}
+
+ if (localHead == bufferTail) return ret; // Empty
+
written = write(fd, outbuf + bufferTail, (localHead - bufferTail));
if (written < 0) return ret;
ret += written;
int bufferSize;
int bufferHead;
int bufferTail;
- int full;
};
#endif