int Demuxer::parse_video_frame(int len, int* full)
{
int ret = 0; // return number of bytes consumed
- int /*stream_sent,*/ bytes_remaining;
+ int bytes_remaining;
switch(state_framepos)
{
local_frame[5] = *inbuf;
++inbuf; ++state_framepos; ++ret; --len;
if (len == 0) return ret;
- // FALL THROUGH TO NEXT BYTE IN STREAM
-// case 2: // First data byte
-// if (len >= frame_length // If we have the entire frame
-// && !state_vid_parsed) // and haven't parsed it yet
-// {
-// if (video_current == state_frametype) // and we're interested
-// parse_video_details(inbuf, frame_length); // then parse it
-// state_vid_parsed = 1;
-// }
}
// We are in the frame data
bytes_remaining = 2 + frame_length - state_framepos;
}
} // No fall through here
-/* if (state_vid_parsed)
- {
- // We have already parsed the whole frame
- if (seeking) // Still not found a sync point. Throw this frame away.
- {
- if (len >= bytes_remaining)
- {
- inbuf += bytes_remaining;
- ret += bytes_remaining;
- state_frametype = state_framepos = 0;
- return ret;
- }
- else
- {
- inbuf += len; ret += len; return ret;
- }
- } // No fall through is allowed here
- // Send frame header to stream
- if (state_stream_fill < 6)
- {
- state_stream_fill += videostream.put(local_frame,
- 6 - state_stream_fill);
- if (state_stream_fill < 6) // stream is full!
- {
- *full = 1; return ret;
- }
- }
- // Send all frame data we have to stream
- if (len >= bytes_remaining) len = bytes_remaining;
- stream_sent = videostream.put(inbuf, len);
- inbuf += stream_sent; ret += stream_sent;
- state_framepos += stream_sent;
- state_stream_fill += stream_sent;
- if (stream_sent != len) // stream is full!
- {
- *full = 1; return ret;
- }
- if (state_framepos == frame_length + 2) // frame done
- {
- state_frametype = state_framepos = 0;
- }
- return ret;
- } // No fall through is allowed here
-*/
- // We haven't parsed the frame yet. It's arriving in pieces.
if (bytes_remaining) // There is data yet to copy to local_frame
{
- if (len >= bytes_remaining) len = bytes_remaining;
+ if (len > bytes_remaining) len = bytes_remaining;
memcpy(local_frame + state_framepos + 4, inbuf, len);
inbuf += len; ret += len; state_framepos += len;
if (len < bytes_remaining) // Not all arrived yet
return ret;
parse_video_details(local_frame+6, frame_length);
- if (seeking) // Still not found a sync point. Ignore this frame.
- return ret;
}
- // We have the whole frame in local_frame. Send it to the stream.
- state_stream_fill += videostream.put(local_frame,
- 6 + frame_length - state_stream_fill);
- if (state_stream_fill < frame_length + 6) // stream is full!
+
+ if (!seeking)
{
- *full = 1; return ret;
+ // We have the whole frame in local_frame. Send it to the stream.
+ // We still support streams that might not consume all the data.
+ state_stream_fill += videostream.put(local_frame,
+ 6 + frame_length - state_stream_fill);
+ if (state_stream_fill < frame_length + 6) // stream is full!
+ {
+ *full = 1; return ret;
+ }
}
state_frametype = state_framepos = 0;
return ret;
int Demuxer::parse_audio_frame(int len, int* full)
{
int ret = 0; // return number of bytes consumed
- int stream_sent, bytes_remaining;
+ int bytes_remaining;
switch(state_framepos)
{
}
} // No fall through is allowed here
- // Send frame header to stream
- if (state_stream_fill < 6)
+ if (bytes_remaining) // There is data yet to copy to local_frame
{
- state_stream_fill += audiostream.put(local_frame,
- 6 - state_stream_fill);
- if (state_stream_fill < 6) // stream is full!
- {
- *full = 1; return ret;
- }
+ if (len > bytes_remaining) len = bytes_remaining;
+ memcpy(local_frame + state_framepos + 4, inbuf, len);
+ inbuf += len; ret += len; state_framepos += len;
+ if (len < bytes_remaining) // Not all arrived yet
+ return ret;
}
- // Send all frame data we have to stream
- if (len >= bytes_remaining) len = bytes_remaining;
- stream_sent = audiostream.put(inbuf, len);
- inbuf += stream_sent; ret += stream_sent;
- state_framepos += stream_sent;
- state_stream_fill += stream_sent;
- if (stream_sent != len) // stream is full!
+
+ // We have the whole frame in local_frame. Send it to the stream.
+ // We still support streams that might not consume all the data.
+ state_stream_fill += audiostream.put(local_frame,
+ 6 + frame_length - state_stream_fill);
+ if (state_stream_fill < frame_length + 6) // stream is full!
{
*full = 1; return ret;
}
- if (state_framepos == frame_length + 2) // frame done
- {
- state_frametype = state_framepos = 0;
- }
+ state_frametype = state_framepos = 0;
return ret;
}