2 Copyright 2005 Mark Calderbank
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 const int Demuxer::FrameRates[9] = { 0, 23, 24, 25, 29, 30, 50, 59, 60 };
25 Demuxer* Demuxer::instance = NULL;
42 Demuxer* Demuxer::getInstance()
47 int Demuxer::init(Callback* tcallback)
51 if ( !videostream.init(demuxMemoryV) ||
52 !audiostream.init(demuxMemoryA) ||
53 !(local_frame = (UCHAR *) malloc(0x10000)))
55 // printf("failed to initialize demuxer\n");
70 video_current = audio_current = -1;
71 horizontal_size = vertical_size = 0;
72 aspect_ratio = (enum AspectRatio) 0;
73 frame_rate = bit_rate = 0;
76 int Demuxer::shutdown()
78 videostream.shutdown();
79 audiostream.shutdown();
89 state_frametype = state_framepos = 0;
93 void Demuxer::flushAudio()
103 void Demuxer::setAudioStream(int id)
108 void Demuxer::setVideoStream(int id)
113 void Demuxer::setAspectRatio(enum AspectRatio ar)
115 if (aspect_ratio != ar)
117 Log::getInstance()->log("Demux", Log::DEBUG, "Aspect ratio difference signalled");
118 if (++arcnt > 3) // avoid changing aspect ratio if glitch in signal
122 callback->call(this);
129 int Demuxer::writeAudio(int fd)
131 return audiostream.drain(fd);
134 int Demuxer::writeVideo(int fd)
136 return videostream.drain(fd);
139 int Demuxer::scan(UCHAR *buf, int len)
141 // Temporarily, just look for the lowest audio stream and return it
147 // We are searching for a string of bytes (0,0,1).
148 byte = *(buf++); --len;
154 if (zeros < 2 || byte != 1)
159 // We have found the pattern (0,0,1).
160 // Check the next byte for the sub-frame type.
161 byte = *(buf++); --len;
162 if (byte >= 0xc0 && byte <= 0xdf) // Audio
163 if (ret == 0 || ret > byte) ret = byte;
168 int Demuxer::put(UCHAR* buf, int len)
170 int ret = 0; // return number of bytes consumed
171 int parsed = 0; // number of bytes parsed by sub-function
172 int full; // sub-function sets this to tell us to exit early
173 inbuf = buf; // Initialize buffer pointer
178 switch (state_frametype)
180 case 0: // Search for frame
181 parsed = parse_find_frame(len);
183 case FRAMETYPE_VID0 ... FRAMETYPE_VIDMAX:
184 parsed = parse_video_frame(len, &full);
186 case FRAMETYPE_AUD0 ... FRAMETYPE_AUDMAX:
187 parsed = parse_audio_frame(len, &full);
189 case FRAMETYPE_PRIVATE_1:
190 parsed = parse_private1_frame(len, &full);
193 ret += parsed; len -= parsed;
194 if (full) // We have to exit early.
195 break; // out of while loop
197 //Log::getInstance()->log("Demuxer", Log::DEBUG, "Put %d; took %d", ret + len, ret);
201 int Demuxer::parse_find_frame(int len)
203 int ret = 0; // return number of bytes parsed
206 // In this function, state_framepos represents
207 // the number of fixed header bytes found so far.
208 if (state_framepos > 3 || state_framepos < 0)
218 switch (state_framepos)
234 state_framepos = 0; // Set initial state for the new frame
238 state_framepos = 1; // Count this as a first header byte!
240 case FRAMETYPE_VID0 ... FRAMETYPE_VIDMAX:
241 case FRAMETYPE_AUD0 ... FRAMETYPE_AUDMAX:
242 case FRAMETYPE_PRIVATE_1:
243 state_frametype = byte;
246 // Not a recognised frame type. Go back to Old Kent Road.
253 int Demuxer::parse_video_frame(int len, int* full)
255 int ret = 0; // return number of bytes consumed
258 switch(state_framepos)
260 case 0: // Brand new video frame. Set initial states.
261 state_stream_fill = 0; state_vid_parsed = 0;
262 // Create a local copy of the frame header
263 local_frame[0] = local_frame[1] = 0; local_frame[2] = 1;
264 local_frame[3] = state_frametype;
265 // If no video stream has been set, use this one.
266 if (video_current == -1) video_current = state_frametype;
267 // Get MSB of frame length and copy to local frame.
268 frame_length = *inbuf << 8;
269 local_frame[4] = *inbuf;
270 ++inbuf; ++state_framepos; ++ret; --len;
271 if (len == 0) return ret;
272 // FALL THROUGH TO NEXT BYTE IN STREAM
273 case 1: // Get LSB of frame length and copy to local frame.
274 frame_length += *inbuf;
275 local_frame[5] = *inbuf;
276 ++inbuf; ++state_framepos; ++ret; --len;
277 if (len == 0) return ret;
279 // We are in the frame data
280 bytes_remaining = 2 + frame_length - state_framepos;
281 if (video_current != state_frametype)
283 // We don't want this frame. Throw it away.
284 if (len >= bytes_remaining)
286 inbuf += bytes_remaining;
287 ret += bytes_remaining;
288 state_frametype = state_framepos = 0;
293 inbuf += len; ret += len;
294 state_framepos += len;
297 } // No fall through here
299 if (bytes_remaining) // There is data yet to copy to local_frame
301 if (len > bytes_remaining) len = bytes_remaining;
302 memcpy(local_frame + state_framepos + 4, inbuf, len);
303 inbuf += len; ret += len; state_framepos += len;
304 if (len < bytes_remaining) // Not all arrived yet
306 parse_video_details(local_frame+6, frame_length);
311 // We have the whole frame in local_frame. Send it to the stream.
312 // We still support streams that might not consume all the data.
313 state_stream_fill += videostream.put(local_frame,
314 6 + frame_length - state_stream_fill);
315 if (state_stream_fill < frame_length + 6) // stream is full!
317 *full = 1; return ret;
320 state_frametype = state_framepos = 0;
324 int Demuxer::parse_audio_frame(int len, int* full)
326 int ret = 0; // return number of bytes consumed
329 switch(state_framepos)
331 case 0: // Brand new audio frame. Set initial states.
332 state_stream_fill = 0;
333 // Create a local copy of the frame header
334 local_frame[0] = local_frame[1] = 0; local_frame[2] = 1;
335 local_frame[3] = state_frametype;
336 // If no audio stream has been set, use this one.
337 if (audio_current == -1) audio_current = state_frametype;
338 // Get MSB of frame length and copy to local frame.
339 frame_length = *inbuf << 8;
340 local_frame[4] = *inbuf;
341 ++inbuf; ++state_framepos; ++ret; --len;
342 if (len == 0) return ret;
343 // FALL THROUGH TO NEXT BYTE IN STREAM
344 case 1: // Get LSB of frame length and copy to local frame.
345 frame_length += *inbuf;
346 local_frame[5] = *inbuf;
347 ++inbuf; ++state_framepos; ++ret; --len;
348 if (len == 0) return ret;
350 // We are in the frame data
351 bytes_remaining = 2 + frame_length - state_framepos;
352 if (audio_current != state_frametype)
354 // We don't want this frame. Throw it away.
355 if (len >= bytes_remaining)
357 inbuf += bytes_remaining;
358 ret += bytes_remaining;
359 state_frametype = state_framepos = 0;
364 inbuf += len; ret += len;
365 state_framepos += len;
368 } // No fall through is allowed here
370 if (bytes_remaining) // There is data yet to copy to local_frame
372 if (len > bytes_remaining) len = bytes_remaining;
373 memcpy(local_frame + state_framepos + 4, inbuf, len);
374 inbuf += len; ret += len; state_framepos += len;
375 if (len < bytes_remaining) // Not all arrived yet
379 // We have the whole frame in local_frame. Send it to the stream.
380 // We still support streams that might not consume all the data.
381 state_stream_fill += audiostream.put(local_frame,
382 6 + frame_length - state_stream_fill);
383 if (state_stream_fill < frame_length + 6) // stream is full!
385 *full = 1; return ret;
387 state_frametype = state_framepos = 0;
391 int Demuxer::parse_private1_frame(int len, int* full)
393 int ret = 0; // return number of bytes consumed
396 switch(state_framepos)
398 case 0: // Brand new frame. Set initial states.
399 // Get MSB of frame length and copy to local frame.
400 frame_length = *inbuf << 8;
401 ++inbuf; ++state_framepos; ++ret; --len;
402 if (len == 0) return ret;
403 // FALL THROUGH TO NEXT BYTE IN STREAM
404 case 1: // Get LSB of frame length and copy to local frame.
405 frame_length += *inbuf;
406 local_frame[5] = *inbuf;
407 ++inbuf; ++state_framepos; ++ret; --len;
408 if (len == 0) return ret;
410 // We are in the frame data
411 bytes_remaining = 2 + frame_length - state_framepos;
412 // Temporary - just discard the frame.
413 if (len >= bytes_remaining)
415 inbuf += bytes_remaining;
416 ret += bytes_remaining;
417 state_frametype = state_framepos = 0;
422 inbuf += len; ret += len;
423 state_framepos += len;
428 void Demuxer::parse_video_details(UCHAR* buf, int len)
430 // Extract video PTS if it exists
431 if ( buf[1] & 0x80 ) // PTS_DTS_flags indicate that PTS is present
433 video_pts = ( (ULLONG)(buf[3] & 0x0E) << 29 ) |
434 ( (ULLONG)(buf[4]) << 22 ) |
435 ( (ULLONG)(buf[5] & 0xFE) << 14 ) |
436 ( (ULLONG)(buf[6]) << 7 ) |
437 ( (ULLONG)(buf[7] & 0xFE) >> 1 );
439 // Now, scan for a GOP header and extract video information
442 while (len >= 8) // 8 is length of a GOP header
444 // We are searching for a string of bytes (0,0,1).
445 byte = *(buf++); --len;
451 if (zeros < 2 || byte != 1)
456 // We have found the pattern (0,0,1).
457 // Check the next byte for the sub-frame type.
458 byte = *(buf++); --len;
461 case 0x00: // Picture header
462 // 10 bits: temporal reference
463 // 3 bits: coding type (I/P/B)
466 if ( (buf[1] & 0x38) == 0x08 ) // I-frame
468 buf += 4; // Minimum length of picture header
471 case 0xb3: // Sequence header
472 // 12 bits: Horizontal size
473 // 12 bits: Vertical size
474 // 4 bits: Aspect ratio
475 // 4 bits: Frame rate code
476 // 18 bits: Bit rate value
479 horizontal_size = ((int)buf[0] << 4) | ((int)buf[1] >> 4);
480 vertical_size = (((int)buf[1] & 0xf) << 8) | (int)buf[2];
481 setAspectRatio((enum AspectRatio)(buf[3] >> 4));
482 frame_rate = buf[3] & 0x0f;
483 if (frame_rate >= 1 && frame_rate <= 8)
484 frame_rate = FrameRates[frame_rate];
487 bit_rate = ((int)buf[4] << 10) |
491 buf += 8; // Minimum length of sequence header
494 case 0xb8: // Group header
495 // We're not going to bother parsing anything.
497 buf += 4; // Minimum length of group header
504 int Demuxer::findVideoPTS(UCHAR* buf, int len, ULLONG* dest)
506 UINT LoPattern = 0x100 | FRAMETYPE_VID0,
507 HiPattern = 0x100 | FRAMETYPE_VIDMAX;
511 UINT pattern = *(UINT*)buf;
513 if (pattern < LoPattern || pattern > HiPattern) continue;
515 UINT framelength = ((UINT)buf[3] << 8) | buf[4];
518 if ( buf[1] & 0x80 ) // PTS_DTS_flags indicate that PTS is present
520 *dest = ( (ULLONG)(buf[3] & 0x0E) << 29 ) |
521 ( (ULLONG)(buf[4]) << 22 ) |
522 ( (ULLONG)(buf[5] & 0xFE) << 14 ) |
523 ( (ULLONG)(buf[6]) << 7 ) |
524 ( (ULLONG)(buf[7] & 0xFE) >> 1 );
528 buf += framelength; len -= framelength;